日期:2014-05-16  浏览次数:20555 次

oracle trigger 的使用

?

?

1.目的:
???? 网厅前台订单查询中只查到netb_order的内容,由于接到一个越级投诉,用户需要看到预受理单子
关于10000号客户人员对订单的回复,由于订单表根据订单类型的不同,关联的是不同的订单明细表,10000号
客服人员的回复存在不同的订单明细表里,于是考虑在数据库级别使用触发器。这样改动量小


2.实现:

a.首先在netb_order中加一个字段 叫 replycontent 用来存10000号客服人员对订单的回复
b.在各种订单明细表中都加上 trigger ,当有10000号客服人员添加回复的时候,trigger 会自动把明细表
回复内容同步到netb_order 中的replycontent 字段

?

?

什么是触发器?

?

触发器
  是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
  功能:
  1、 允许/限制对表的修改
  2、 自动生成派生列,比如自增字段
  3、 强制数据一致性
  4、 提供审计和日志记录
  5、 防止无效的事务处理
  6、 启用复杂的业务逻辑

?

?

?

先写一个例子玩玩 ,建立两个表test1,test2,表结构一样,? 当往test1表中插入数据的时候,使用触发器,自动往test2表中也插入一条数据

?

create or replace trigger tr_insert_test1
  before insert on test1
  for each row
begin

insert into test2 values(:new.id,:new.name);

end;

?

?

当使用 insert into test1(id,name) values('123','huxl');的时候 test2表中也多了一条记录

?

?

:new --为一个引用最新的列值;
:old --为一个引用以前的列值; 这两个变量只有在使用了关键字 "FOR EACH ROW"时才存在.且update语句两个都有,而insert只有:new ,delect 只有:old;

?

before表示在操作完成前触发, after表示在完成后触发

?

下面完成我们的业务

?

?

?

3.步骤:
a. 见将历史数据同步到netb_order表中

update netb_order o  set o.replycontent= (select up.replycontent
from
netb_PackagesNewSetUp up  where up.id=o.businessid);



update netb_order o  set o.replycontent= (select ps.reply
from
netb_phonenewsetup ps  where ps.id=o.businessid);



update netb_order o  set o.replycontent= (select sr.reply
from
netb_selfhoodreq sr  where sr.selfhoodreqid=o.businessid);


update netb_order o  set o.replycontent= (select ci.reply
from
netb_cards_info ci  where ci.id=o.businessid);


update netb_order o  set o.replycontent= (select bo.reply
from
netb_basicorder bo  where bo.id=o.businessid);


2. 为订单从表添加触发器


drop trigger xxx

触发器需要一个一个执行

create or replace trigger tr_netb_PackagesNewSetUp
  after update of replycontent on netb_PackagesNewSetUp
  for each row
begin
update netb_order set replycontent=:new.replycontent where businessid=:old.id;

end;


create or replace trigger tr_netb_phonenewsetup
  after update of reply on netb_phonenewsetup
  for each row
begin
update netb_order set replycontent=:new.reply where businessid=:old.id;

end;

create or replace trigger tr_netb_selfhoodreq
  after update of reply on netb_selfhoodreq
  for each row
begin
update netb_order set replycontent=:new.reply where businessid=:old.selfhoodreqid;

end;


create or replace trigger tr_netb_cards_info
  after update of reply on netb_cards_info
  for each row
begin
update netb_order set replycontent=:new.reply where businessid=:old.id;

end;



create or replace trigger tr_netb_basicorder
  after update of reply on netb_basicorder
  for each row
begin
update netb_order set replycontent=:new.reply where businessid=:old.id;

end;

?

?

?

?

?参考:

http://hi.baidu.com/zhangyadong110/blog/item/289220233f983baf4723e807.html

?

http://space.itpub.net/12045182/viewspace-613908

?

?

?