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。

  • 相关阅读:
    一个好的时间函数
    Codeforces 785E. Anton and Permutation
    Codeforces 785 D. Anton and School
    Codeforces 510 E. Fox And Dinner
    Codeforces 242 E. XOR on Segment
    Codeforces 629 E. Famil Door and Roads
    Codeforces 600E. Lomsat gelral(Dsu on tree学习)
    Codeforces 438D The Child and Sequence
    Codeforces 729E Subordinates
    【ATcoder】D
  • 原文地址:https://www.cnblogs.com/kingwangzhen/p/1824697.html
Copyright © 2011-2022 走看看