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

    载自http://xiaoxinshome.javaeye.com/blog/139609
    --------
    语法规则:
    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。



  • 相关阅读:
    几个比较好的IT站和开发库官网
    Win7下Qt5.2中使用OpenGL的glu函数库无法使用的解决方案
    QT5.2 Assistant-设置应用程序图标
    linux下文件编码格式转换方法(gb18030/utf-8)
    QT-进制转换计算器
    QT-图标设置
    QT-make: *** No rule to make target
    QT的exe文件打开显示,无法定位程序***输入点于动态链接库****
    QT工程文件上传Github仓库
    Eclipse中文乱码
  • 原文地址:https://www.cnblogs.com/redcoatjk/p/3562389.html
Copyright © 2011-2022 走看看