LXY3800 发表于 2018-10-23 07:23:03

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 ;

页: [1]
查看完整版本: PL/SQL-06