Oracle数据库的触发器

一:概念

  是oracle在发生某些事件时,可以自动触发并调用的plsql程序,可以定义在事件上,由事件自动触发。

二:分类

  1)系统触发器:由系统事件触发的plsql程序,比如登陆oracle数据库,登出oracle。

  2)DML触发器:由DML语句触发的plsql程序,比如增删改。

三:DML触发器

  -->语句触发器

    a.如果执行完一条DML语句后,希望对整张表的数据进行预算,使用语句触发器,这种触发器是在DML执行前/后自动触发的。

    b.语法

      create [or replace] trigger 触发器名   

      before | after insert | update | delete on 表

      declare

        --变量声明区

      begin

        --处理业务

      end;

      /  

      注:触发器自动调用,在DML语句执行之前或之后。

    c.练习:在进行任何增删改操作后,计算出员工数,员工薪资合计,员工平均工资。

      create or replace trigger emp_tri

      after insert or update or delete on emp

      declare

        count_emp number;

        sal_total number;

          sal_avg number;

      begin

        select count(*) into count_emp from emp;

        select sum(sal) into sal_total from emp;

        select avg(sal) into sal_avg from emp;

        dbms_output.put_line(count_emp||'  '||sal_total||'  '||sal_avg);

      end;

      /

    update emp set sal = 1000 where empno=7698;--当我们执行此sql语句时,触发器就会触发,输出相应的值。

  -->行级触发器

    a.如果在执行DML时,希望对当前操作的数据进行处理,那么可以使用行级触发器。行级触发器也是在执行DML之前/后自动触发的,在行级触发器中可以使用行变量引用到DML所操作的数据,这个行变量是内置的,可以直接使用。

    b.行变量

      --  :new  表示引用的是新增后的行数据

      --  :old  表示引用的是修改/删除前的行数据

      --  规则

          insert语句只有:new,表示插入后的数据。

          delete语句只有:old,表示删除前的旧的数据。

          update语句二者都有,new表示修改后的数据,old表示修改前的数据。

    c.语法

      create or replace trigger 触发器名

      before | after insert | update | delete on 表名  

      for each row

      declare

        --声明变量

      begin    

        --业务逻辑

      end;

      /

    d.练习:删除dept表数据之前,将删除记录存入备份表。

    create or replace trigger dept_trig

    before delete on dept

    for each row

    declare

    begin  

      insert into dept_bak values(:old,deptno,:old.name,:old.loc);

    end;

    /

  注:触发器不要写commit。 

 

posted @ 2018-05-17 15:55  Coding_Now  阅读(3467)  评论(0编辑  收藏  举报