气死我了,昨天写了1个多小时的PL/SQL学习笔记(2)居然没有发布上,真过分,哎也没有心情再去重新写了,直接上第三篇。
异常处理概念
在PL/SQL中,主要有三种异常处理方式,1、预定义(predefined)异常;2、非预定义异常;3、用户定义异常。下面我们分别一一介绍各个异常的处理方式
1、预定义异常
结构为:
exception
when exp1 then .................;
when exp2 then................;
.......
when others then.....................;
2、非预定义异常
结构为3部分(1)、声明 : 异常名 exception;(2)、初始化: pragma exception_init(异常名 ,编号);(3)、异常处理:在exception的when语句中对这个exception进行处理。
3、用户定义异常
结构同样分为3部分(1)、声明异常:exception;(2)、抛出异常: raise 异常名;(3)、异常处理:在exception的when语句中对这个exception进行处理。
函数和过程
函数和过程是存储在数据库中的可以被其他函数或过程调用。两者的区别在于函数有返回值,过程没有返回值。
1、函数的创建格式为:
create or replace function 函数名(arg1 in|out|in out type,......) return type is .....
begin
............................
return (result);
exception
.............................
end 函数名;
2、函数的调用方法
有三种调用方法,(1)、序列表示法,函数名(arg1,...argn),这儿的参数序列必须与函数定义时一样。(2)、名称表示法,函数名(arg1=>par1,....argn=>parn),这儿的参数可以自由排列;(3)、混合以上两种,但是只要一旦使用名称表示法,后面的参数都必须使用名称表示法。
3、参数的默认值
只需要在参数的后面加default value,就行了。
4、过程的定义调用和函数都差不多,我就不再赘述了。
5、删除函数或过程,drop function/procedure 名字;
包的创建和应用
在PL/SQL中的一个包相当于java中的一个类,把变量、常量、函数、过程这些PL/SQL的程序设计元素组合起来。一个包包含两个部分,包定义和包主体。
包定义:定义程序设计元素,这些元素全是共有元素,可以被其他程序调用。
包主体:在这里面还可以定义元素,可以是私有的。在这个部分我们必须实现所有的包定义元素。
这两个部分分开编译,分开存储在数据库字典中。
包定义的语法
create or replace package 名字 [is|as]
元素定义
end 名字;
包体定义的语法
create or replace package body 名字 [is|as]
元素定义
end 名字;
包的开发步骤
1、把各个存储函数和过程调试通过;
2、把各个函数和过程聚在一起;
3、根据各个函数和过程加上包定义;
4、加上包主体;
5、调试通过。
删除包,也是使用drop 语句。
子程序的重载
这个重载和java一样,但是这儿有一个类型系列必须不同的规定,像char和varchat是一个系列,他们就不能重载。
触发器
以独立的对象存储在数据库中,由事件触发,不能接受参数。
触发器的组成(1)、触发事件(DML/系统事件);(2)、触发时间(before|after);(3)、触发频率(语句级|行级);(4)、触发器本身(触发事件之后需要干的事)。
有三类触发器
(1)、DML触发器
(2)、替代触发器
(3)、系统触发器
DML触发器
语法:
create or replace trigger 名字
[before|after]
update|delete|insert [of column [of column.....]] on 表名
[for each row]
[when condition]
。。。。。。。。。
end 名字;
触发器的执行顺序
before 语句级 trigger
对于每一行
before 行级 trigger
触发器本身
after 行级 trigger
after 语句级 trigger
触发器的限制
(1)、trigger的大小不能超过32kb;
(2)、trigger体内的select语句必须有into语句或者与Cursor关联
(3)、trigger体内不能有事务控制语句
(4)、trigger体内调用了函数或过程,则函数和过程中必须满足(3);
(5)、不能用long,long raw类型
DML触发器的谓词
interting,updating,deletiing都是bool型的,我们可以用来判断是哪一种的DML触发器。我们在定义的时候可以用or连接多个DML语句,然后用when 语句判断处理。具体谁进谁我们可以从字面上看出来。
替代触发器
create or replace trigger 名字 instead of DML语句 on view [for each view]
trigger body
end 名字;
替代触发器主要是针对视图操作的,因为我们有时不能直接对视图进行操作,我们可以在trigger体中完成对视图的操作。
系统触发器
这儿我不想再赘述了。
删除触发器
可以直接用drop语句,另外当表或者视图被删除时,其上的所有trigger都自动删除。
触发器的状态
disable,enable。我们可以使用Alter 语句改变trigger的状态。
eg:
alter trigger 名字 enable|disable;
alter table|view enable|disable all triggers。
《完结》