触发器
与包或者子程序不同,触发器不能被显式调用,而是在数据库事件发生时隐式地运行,并且触发器不能接收参数。
触发器语句块被执行称为触发事件,而触发的事件可以是对数据库表的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 ;
原文:http://wyhstar460.blog.51cto.com/2972581/1640530