免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1480 | 回复: 1
打印 上一主题 下一主题

[Veritas NBU] oracle 数据库 触发器 trigger 语法 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-03-15 21:47 |只看该作者 |倒序浏览
oracle 数据库 触发器 trigger 语法









语法规则:
Create trigger 触发器名
    Before| after   insert|delete|(update of 列名)

On 表名



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。

论坛徽章:
0
2 [报告]
发表于 2012-03-15 21:47 |只看该作者
谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP