zoukankan      html  css  js  c++  java
  • oracle Trigger

    --********************************************************************************************
    --功能说明:  (TR_BU_BILL_NOTICE_TASK_INFO),自动生成流水号、自动更新操作人和操作日期
    --调用函数:
    --修改记录: created by zhonglihai 2019.12.25
    --********************************************************************************************
    CREATE OR REPLACE TRIGGER BEPTRIG.TR_BU_BILL_WORK_FLOW_DETAIL_SET
       BEFORE UPDATE ON BEPDATA.BILL_WORK_FLOW_DETAIL_SET
       REFERENCING NEW AS NEW OLD AS OLD
       FOR EACH ROW
    DECLARE
       v_trigger_user VARCHAR2(50);
       v_trigger_date DATE;
       CURSOR c_switch(cp_switch beptrig.bep_tr_switch.switch_for%TYPE) IS
          SELECT status
            FROM beptrig.bep_tr_switch
           WHERE trigger_name = 'TR_BU_BILL_WORK_FLOW_DETAIL_SET'
             AND switch_for = cp_switch;
       v_status        beptrig.bep_tr_switch.status%TYPE;
       v_sqlcode       VARCHAR2(6);
       v_sqlerrm       VARCHAR2(200);
       v_error_comment VARCHAR2(300);
    BEGIN
       v_error_comment := 'before get_user';
       v_trigger_user  := pub_sys_package.get_user();
       v_trigger_date  := SYSDATE;
     
       v_error_comment := 'before BEP_SYNCH';
       OPEN c_switch('BEP_SYNCH');
       FETCH c_switch
          INTO v_status;
       IF c_switch%FOUND AND v_status = '1' THEN
          :new.updated_user := v_trigger_user;
          :new.updated_date := v_trigger_date;
       END IF;
       CLOSE c_switch;
     
       --出错处理
    EXCEPTION
       WHEN OTHERS THEN
          v_sqlcode := SQLCODE;
          v_sqlerrm := substr(SQLERRM, 1, 200);
          INSERT INTO beptrig.bep_tr_error_log
             (error_no,
              error_message,
              trigger_name,
              trigger_user,
              trigger_date,
              error_comment)
          VALUES
             (v_sqlcode,
              v_sqlerrm,
              'TR_BU_BILL_WORK_FLOW_DETAIL_SET',
              v_trigger_user,
              v_trigger_date,
              v_error_comment);
     
    END TR_BU_BILL_WORK_FLOW_DETAIL_SET;
    /
    

      

    1、For each row的意义是:在一次操作表的语句中,每操作成功一行就会触发一次;不写的话,表示是表级触发器,则无论操作多少行,都只触发一次;

    2、REFERENCING OLD 和 REFERENCING NEW 的含义不同,具体取决于触发器是行级还是语句级触发器。对于行级触发器,REFERENCING OLD 子句允许引用更新或删除之前行中的值,REFERENCING NEW子句允许引用已插入或更新的值。在 BEFORE 和 AFTER 触发器中可以引用 OLD 和 NEW 行。REFERENCING NEW 子句允许在插入或更新操作发生之前在 BEFORE 触发器中修改新行

    3、:NEW 和:OLD使用方法和意义,new 只出现在insertupdate时,old只出现在updatedelete时。在insertnew表示新插入的行数据,updatenew表示要替换的新数据、old表示要被更改的原来的数据行,deleteold表示要被删除的数据。
    begin前面出现的newold不加冒号,beginend之间出现的newold都要在前面加上":"。

    REFERENCING OLD AS OLD NEW AS NEW
    
    • 1

    这样写之后就可以在begin end直接直接使用别名来引用。

    --********************************************************************************************
    --功能说明:  (TR_BI_BILL_WORK_FLOW_DETAIL_SET),自动生产创建人创建日期更新操作人和操作日期
    --调用函数:
    --修改记录: created by zhonglihai 2019.12.25
    --********************************************************************************************
    CREATE OR REPLACE TRIGGER BEPTRIG.TR_BI_BILL_WORK_FLOW_DETAIL_SET
      BEFORE INSERT ON BEPDATA.BILL_WORK_FLOW_DETAIL_SET
      FOR EACH ROW
    DECLARE
      v_trigger_user VARCHAR2(100);
      v_trigger_date DATE;
    
      CURSOR c_switch(cp_switch bep_tr_switch.switch_for%TYPE) IS
        SELECT status
          FROM bep_tr_switch
         WHERE trigger_name = 'TR_BI_BILL_WORK_FLOW_DETAIL_SET'
           AND switch_for = cp_switch;
    
      v_status        bep_tr_switch.status%TYPE;
      v_sqlcode       VARCHAR2(6);
      v_sqlerrm       VARCHAR2(200);
      v_error_comment VARCHAR2(300);
    BEGIN
      v_error_comment := 'before get_user';
      v_trigger_user  := pub_sys_package.get_user();
      v_trigger_date  := SYSDATE;
    
      --需求来源:BEP数据同步
      v_error_comment := 'before BEP_SYNCH';
      --获取子功能控制信息
      OPEN c_switch('BEP_SYNCH');
      FETCH c_switch
        INTO v_status;
      IF c_switch%FOUND AND v_status = '1' THEN
        
        :new.created_user := v_trigger_user;
        :new.created_date := v_trigger_date;
        :new.updated_user := v_trigger_user;
        :new.updated_date := v_trigger_date;
      END IF;
    
      CLOSE c_switch;
      --出错处理
    EXCEPTION
      WHEN OTHERS THEN
        v_sqlcode := SQLCODE;
        v_sqlerrm := SUBSTR(SQLERRM, 1, 200);
      
        INSERT INTO bep_tr_error_log
          (error_no,
           --系统错误代码
           error_message,
           --系统错误信息
           trigger_name,
           --出错的trigger
           trigger_user,
           --出错的用户
           trigger_date,
           --出错的时间
           error_comment --出错详细信息
           )
        VALUES
          (v_sqlcode,
           v_sqlerrm,
           'TR_BI_BILL_WORK_FLOW_DETAIL_SET',
           v_trigger_user,
           v_trigger_date,
           v_error_comment);
    END TR_BI_BILL_WORK_FLOW_DETAIL_SET;
  • 相关阅读:
    统计nginx日志里访问次数最多的前十个IP
    while 格式化输出 运算符 字符编码
    Python 软件安装
    Python 基础
    Typora 基础的使用方法
    Django ORM (四) annotate,F,Q 查询
    Django 惰性机制
    Django ORM (三) 查询,删除,更新操作
    Django ORM (二) 增加操作
    Django ORM (一) 创建数据库和模型常用的字段类型参数及Field 重要参数介绍
  • 原文地址:https://www.cnblogs.com/zhonglihai/p/12090121.html
Copyright © 2011-2022 走看看