tangweijia

构客网首页  博客  论坛

 
  本文的标签
技术 (收录2710篇)Oracle (收录30篇)触发器 (收录2篇)
  用户信息
 
帐号:  新手必读
密码: 保存密码
 
  分类列表
全部类别(16 篇)
我的文章(16 篇)
  按月归档
2008年-07月(8 篇)
2008年-11月(8 篇)
  SOA2007 - SOA实践
我们何时迈向SOA
——SOA在中国的整体发展现状究竟如何?
我们如何迈向SOA
——中国企业如何迈出实施SOA的第一步?
我们应采用何种技术
——SOA国际标准SCA/SDO的具体内涵?
我们还需要何种技能
——SOA将如何改变系统架构设计以及项目管理过程?

oracle触发器修改自己

发布时间:2008年07月17日 作者:tangweijia

阅读次数:173次 类别:我的文章 永久链接 Trackback 
参加SOA我有话说
本来,这是一个没有必要的,但是,对于oracle来说,也算一个技巧,本文讲述触发器如何自己修改自己

在实际应用中,有时候触发器需要修改触发自己的表,这时,我们可以采用如下的方式:

1. Rename your table with another name;
2. Create a view for select * from the table with the original name of the table;
3. Create a instead of trigger on the view, in the view you can access and update yur base table.

 

如下

建立一个表

create table t1(
id number(6) primary key
,pid number(6)
,value number(15,2)
,f1 varchar2(10)
,f2 varchar2(20)
);

 

建一个视图

create or replace view t1_v as select * from t1;

建触发器


create or replace trigger bug_t1_v
instead of update on t1_v
for each row
declare
procedure update_parents(i_id in number, i_value in number);
procedure update_parents(i_id in number, i_value in number) is
begin
declare
l_pid t1.pid%type;
begin
select pid into l_pid
from t1
where id = i_id;
if l_pid <> 0 then
update t1 set value = nvl(value,0) + nvl(i_value,0)
where id = l_pid;
update_parents(l_pid, i_value);
end if;
exception
when no_data_found then
null;
end;
end update_parents;
begin
--
-- Update Value Field for current record and Parent records
--
if nvl(:new.value,0) - nvl(:old.value,0) <> 0 then
update t1 set value = value + nvl(:new.value,0) - nvl(:old.value,0)
where id = :new.id;
update_parents(:new.id, nvl(:new.value,0) - nvl(:old.value,0));
end if;
--
-- Update Others Fields
--
update t1 set f1 = :new.f1
,f2 = :new.f2
where id = :new.id;
end;

 

最后可以测试

 


--
-- Testing
--
-- With this view: t1_v
--
begin
for i in 1..50 loop
Insert into t1_v values(i, i-1, 0, \"\", \"\");
end loop;
end;
/

delete from t1_v;

begin
for i in 1..50 loop
Insert into t1_v values(i, i-1, 0, \"\", \"\");
end loop;
end;
/

update t1_v set f1 = \"TEST\" where id = 49;


update t1_v set value = value + 5 , f1 = \"AA\", F2 = \"BB\"
where id = 50;

 


 评论 查看全部评论