zoukankan      html  css  js  c++  java
  • oracle触发器使用笔记

    语法规则:
    Create [or replace] trigger [模式.]触发器名

           Before| after   insert|delete|(update of 列名)

    On 表名

    [for each row]

    When 条件

    PL/SQL块

    说明:

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

    When条件的出现说明了,在DML操作的时候也许一定会触发触发器,但是触发器不一定会做实际的工作,比如when 后的条件不为真的时候,触发器只是简单地跳过了PL/SQL块;

    例子:

    sql 代码
    1. create or replace trigger wf_tri_user_list before insert or update or delete on user_list   
    2. for each row   
    3. declare  
    4.    uid varchar2(10); useq varchar2(10); asql varchar2(200); namea varchar2(200); nameb varchar2(200);   
    5. begin  
    6.    namea:=NULL;   
    7.    nameb:=NULL;   
    8.    if inserting then  
    9.       insert into wflow.bpm_org_user(userid,username,diaplayname,seq) values(:NEW.user_id,:NEW.user_name,:NEW.user_realname,:NEW.user_id);   
    10.       dbms_output.put_line('insert trigger is chufale .....');   
    11.         
    12.    end if;   
    13.    if updating then  
    14.       if (:NEW.user_name<>:OLD.user_name) and (:NEW.user_realname<>:OLD.user_realname) then  
    15.          namea:=:NEW.user_name;   
    16.          nameb:=:NEW.user_realname;   
    17.          asql:='update wflow.bpm_org_user set diaplayname=:1 where username=:2';   
    18.          execute immediate asql using namea,nameb;   
    19.       else  
    20.         if :NEW.user_name<>:OLD.user_name then  
    21.           namea:=:NEW.user_name;   
    22.           asql:='update wflow.bpm_org_user set user_name=:1 where username=:2';   
    23.           execute immediate asql using namea;   
    24.         else  
    25.           if :NEW.user_realname<>:OLD.user_realname then  
    26.             nameb:=:NEW.user_realname;   
    27.             asql:='update wflow.bpm_org_user set diaplayname=:1 where username=:2';   
    28.             execute immediate asql using nameb,:OLD.user_id;   
    29.           end if;   
    30.         end if;   
    31.       end if;   
    32.    end if;   
    33.    if deleting then  
    34.       update wflow.bpm_org_jobusers set userid = 0 where :OLD.user_id =userid and parentid=-1;   
    35.       delete from wflow.bpm_org_jobusers where userid = :OLD.user_id;   
    36.       delete wflow.bpm_org_user where userid=:OLD.user_id;   
    37.    end if;   
    38.    commit;   
    39. end;   
    40.   

    关键字:

    :NEW 和:OLD使用方法和意义,new 只出现在insert和update时,old只出现在update和delete时。在insert时new表示新插入的行数据,update时new表示要替换的新数据、old表示要被更改的原来的数据行,delete时old表示要被删除的数据。

    注意:

    在触发器中不能使用commit。

  • 相关阅读:
    RTSP协议转RTMP协议的行业视频接入网关EasyRTSPLive如何实现音频转码的
    RTSP协议转RTMP协议的行业视频接入网关EasyRTSPLive之跨平台ini配置及通道的方法
    GB/T28181协议EasyGBS播放1080p视频直播会花屏
    国标GB/T28181协议下播放器起播慢或者延迟高如何解决?
    EasyGBS查找大华设备的录像列表时失败
    ffmpeg增加h264编解码功能模块方法
    EasyNVR控制台运行出现invalid license关于计算机保护软件类似于360、腾讯云管家等限制相关问题
    摄像机经过多级路由转换无法被EasyNVR拉流问题处理方法
    使用EasyNVR软件对接海康摄像头对接失败问题解析
    GB/T28181协议使用EasyNVR降低播放延迟方法
  • 原文地址:https://www.cnblogs.com/nosnowwolf/p/1757882.html
Copyright © 2011-2022 走看看