• oracle pl/sql 中的触发器


    oracle 11g 将触发器分为5种:

    1.DDL触发器:当在数据库中创建、修改、重命名、删除对象时触发。

    2.DML或行级别触发器:当在表中插入、更新 或 删除数据时触发;可用于在值被改变前(before)进行审核、检查、保存、和替代。

    3.复合触发器: 既是语句级又是行级触发器。在需要同时使用语句级触发器和行级触发器时可以使用复合触发器。

    4.insteadof 触发器:用于停止DML语句的执行并重定向DML语句,即视图触发器。

    5.系统或数据库事件触发器:用于跟踪系统事件。

    注意:触发器中不能做dcl操作(savepoint、commit、rollback),也不能在所调用的函数和过程中执行 dcl操作。

       触发器声明自治则可以包含dcl语句,语法:pragma autonomous_transaction;

       变异表是一个正在改变的表,当表在改变时不能对表进行查询或修改操作,否则提示:ORA-04091。

            触发器主体不能大于32760个字节(因为触发器主体存贮在long数据类型的列中),所以建议将功能写在过程或函数中。

            触发器中不能使用long\long row类型的变量,long\long row类型的列不能使用:new和:old伪记录。

       语句级(表级)触发器不能使用:new和:old伪记录,不能用于收集事务的详细信息,否则提示:ORA-04082。

            行级触发器中,when子句使用new和old伪记录,触发器可以修改:new和:old伪记录的值。

        复合触发器不支持when子句,不支持自治,不支持exception块,不支持goto,不支持:new和:old伪记录(除行级语句块外)。

        只有dml语句能触发复合触发器,且必须有修改的行,触发器必须实现before statement 和after statement 块  才能触发。

    举例:

    1.用包头来定义数据结构

    CREATE OR REPLACE Package Pkg_BldroomData_duBuildarea
    As
     type p_buildids is table of bldroom.buildid%type index by binary_integer;
     v_buildids p_buildids;
     v_NumEntries binary_integer := 0;
    End Pkg_BldroomData_duBuildarea;
    /
    show err;

    2.行级触发器
    Create Or Replace Trigger Tri_Bldroom_Biud_duBuildarea
     After Insert Or Delete Or Update Of buildid,resopertype,buildarea,designusage On bldroom for each row
    Declare
    Begin
     --[记录数据]--
     if inserting then
      Pkg_BldroomData_duBuildarea.v_NumEntries := Pkg_BldroomData_duBuildarea.v_NumEntries + 1;
      Pkg_BldroomData_duBuildarea.v_buildids(Pkg_BldroomData_duBuildarea.v_NumEntries) := :new.buildid;
     elsif deleting then
      Pkg_BldroomData_duBuildarea.v_NumEntries := Pkg_BldroomData_duBuildarea.v_NumEntries + 1;
      Pkg_BldroomData_duBuildarea.v_buildids(Pkg_BldroomData_duBuildarea.v_NumEntries) := :old.buildid;
     elsif updating then
      if :new.resopertype<>:old.resopertype or :new.buildarea<>:old.buildarea or :new.designusage<>:old.designusage then
       Pkg_BldroomData_duBuildarea.v_NumEntries := Pkg_BldroomData_duBuildarea.v_NumEntries + 1;
       Pkg_BldroomData_duBuildarea.v_buildids(Pkg_BldroomData_duBuildarea.v_NumEntries) := :old.buildid;   
      end if;
      if :new.buildid<>:old.buildid then
       Pkg_BldroomData_duBuildarea.v_NumEntries := Pkg_BldroomData_duBuildarea.v_NumEntries + 1;
       Pkg_BldroomData_duBuildarea.v_buildids(Pkg_BldroomData_duBuildarea.v_NumEntries) := :old.buildid; 
       Pkg_BldroomData_duBuildarea.v_NumEntries := Pkg_BldroomData_duBuildarea.v_NumEntries + 1;
       Pkg_BldroomData_duBuildarea.v_buildids(Pkg_BldroomData_duBuildarea.v_NumEntries) := :new.buildid;   
      end if;
     end if;
    End Tri_Bldroom_Biud_duBuildarea;
    /
    show err;

    3.语句级触发器
    Create Or Replace Trigger Tri_Bldroom_AllAiu_duBuildArea
     After Insert Or Delete Or Update Of buildid,resopertype,buildarea,designusage On bldroom
    Declare
     l_buildid  bldroom.buildid%type;
    Begin
     for v_LoopIndex in  1..Pkg_BldroomData_duBuildarea.v_NumEntries loop
      --[获取变量]--
      l_buildid := Pkg_BldroomData_duBuildarea.v_buildids(v_LoopIndex);
      --[汇总面积]--
      proc_blddesignusagearea(l_buildid);
      end loop;
     Pkg_BldroomData_duBuildarea.v_NumEntries := 0;
    End Tri_Bldroom_AllAiu_duBuildArea;
    /
    show err;

  • 相关阅读:
    济南学习D1T5__HEAP
    快速计算C(n,r)
    快速阶乘算法
    济南学习D2T1__折纸带
    济南学习D3T1__线性筛和阶乘质因数分解
    栈与队列:栈的链式储存结构
    线性表应用:建立一个随机数 链表获得中间结点
    栈与队列应用:二进制转十进制 八进制 十六进制(栈)
    线性表:单链表基本操作代码
    线性表应用:魔术师发牌与拉丁(Latin)方阵(循环链表)
  • 原文地址:https://www.cnblogs.com/BradMiller/p/1743997.html
Copyright © 2020-2023  润新知