• 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。 

  • 相关阅读:
    go语言之goroute协程
    Vue中Computed和Watch的用法及区别
    php判断复选框是否被选中的方法
    基于workerman的实时推送
    织梦引入公共模板
    织梦快速建站首页模板
    golang解决中文乱码的方法
    Vue项目中使用可视化图表echarts
    解决for循环中异步请求顺序不一致的问题
    layui多图上传实现删除功能的方法
  • 原文地址:https://www.cnblogs.com/lyr999736/p/9051553.html
Copyright © 2020-2023  润新知