PL/SQL-06

触发器


与包或者子程序不同,触发器不能被显式调用,而是在数据库事件发生时隐式地运行,并且触发器不能接收参数。

触发器语句块被执行称为触发事件,而触发的事件可以是对数据库表的DML操作,比如insert , update ,或者 delete 操作,或者对视图的操作。

oracle 还支持对系统事件的触发,如实例的开关,用户的登录。


-- 创建表

create table scott.raisesalarylog

(

empno number (10) not null primary key ,

raiseddate date ,

originalsal number (10,2) ,

raisedsal number (10,2)

) ;


--定义触发器

create or replace trigger scott.raisesalarychange 

 --定义after 触发,监测emp表的sal列的更新 

 after update of sal on scott.emp 

 --定义行级别触发器

 for each row 

 --声明区 

 declare

 v_reccount int ;

 begin

 select count(*) into v_reccount from scott.raisesalarylog where empno = :OLD.empno ;

 if v_reccount = 0 

 then insert into scott.raisesalarylog values ( :OLD.empno , SYSDATE , :OLD.SAL ,  :NEW.sal) ;

 else update scott.raisesalarylog set raiseddate = sysdate , originalsal = :OLD.sal , raisedsal = :NEW.sal where empno = :OLD.empno ;

 end if ;

 exception when others 

 then dbms_output.put_line (SQLERRM);

 end ;


执行语句

update scott.emp set sal = sal * 1.2 where empno = 7369 ;


然后执行查询 


select * from scott.raisesalarylog ;


郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。