当前位置: 代码迷 >> SQL >> Oracle 学习笔记 19 - 触发器跟包浅析(PL/SQL)
  详细解决方案

Oracle 学习笔记 19 - 触发器跟包浅析(PL/SQL)

热度:70   发布时间:2016-05-05 11:29:01.0
Oracle 学习笔记 19 -- 触发器和包浅析(PL/SQL)

触发器是存放在数据库中的一种特殊类型的子程序。不能被用户直接调用,而是当特定事件或操作发生时由系统自动

用执行。触发器不能接受参数。所以运行触发器就叫做触发或点火。Oracle事件指的是数据库的表进行的insert 、update、delete操作或对视图进行类似的操作。

触发器是许多关系数据库系统都提供的一项技术。在Oracle系统里,触发器类似过程和函数,都有声明,执行和异常

处理过程的PL/SQL块。

触发器的组成:

触发事件:在何种情况下触发;例如:INSERT , UPDATE , DELETE 。

触发时间:是在触发事件发生之前还是之后触发,也就是触发事件和trigger的操作顺序。

触发器本身:trigger被触发之后的目的和意图,正是触发器本身要做的事。

触发器频率:触发器内定义的动作被执行的次数。有语句级触发器和行级触发器。语句级触发器当触发事件发生时,只执行一次。行级触发器当触发事件发生时,每一行执行一次。

基本语法:

create or replace trigger trigger_name

before | after

insert | delete | update on table_name

for each row 

when condition

before和after指出触发的时序是前触发还是后触发。前触发是在触发事件之前执行,后触发是在触发事件之后执行。for each row 说明触发器为行触发器。when子句说明的是触发的约束条件。

例:编写一个简单触发器,当执行update操作时,输出helloworld 。

create or replace trigger update_emp_trigger
after 
       update on emp 
       for each row 
begin 
    dbms_output.put_line('Hello World');
end ;

测试:

SQL> update emp set sal = sal+ 10 ;
 
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
Hello World
 
14 rows updated

上面的测试中,并没有调用触发器,触发器是系统自动执行的。并不能为用户直接调用。for each row如果不写则默认为语句级触发器。

:new 和 :old 修饰符

:new 修饰符访问操作完成后列的值。

:old 修饰符访问操作完成前列的值。

例:使用:new和:old操作符分别获取更新之前的值,和之后的值。

create or replace trigger update_emp_trigger1
after 
       update on emp 
       for each row 
begin 
    dbms_output.put_line(:old.sal || ',' || :new.sal);
end ;

测试:

SQL> update emp set sal = sal+ 10 ;
 
902,912
1717.44,1727.44
1346.13,1356.13
3115.19,3125.19
1346.13,1356.13
2985.14,2995.14
2568.98,2578.98
3141.2,3151.2
5120.5,5130.5
1611.35,1621.35
1186.99,1196.99
2100.8,2110.8
3141.2,3151.2
1399.17,1409.17
 
14 rows updated

删除触发器

基本语法

DROP TRIGGER trigger_name ;

创建触发器时,如果发生错误可以使用show errors命令来查看错误信息。


将数据和子程序组合在一起构成包。与java中的类类似,包在PL/SQL程序设计中,用以实现面向对象的技术。

包的构成分为两个部分,一个是说明部分,一个是实现部分。

定义包

create or replace package body package_name

is | as 

begin

 --pl/sql 语句;

end ;

对包内共有元素的调用格式为:包名.类名 。

删除包

DROP PACKAGE package_name ;


  相关解决方案