oracle触发器插入问题

chaoloveyou 2010-02-02 04:34:57
我有两个表(A表和B表),机构完全相同:A 表建立触发器
当insert into A(id,name) values('1','zhangsan'); 我只想将name=zhangsan的时候将insert语句插入到B表中而A表不执行操作这个触发器应该怎么实现呢?
如:
if :nve.name=‘zhangsan' then
insert into B(id,name) values(:nve.id,:nve.name);
end if;
可是像我这么写这两个表都有数据呀,我只想让B表中有数据而A表没有,这个触发器应该怎么写呢,谢谢给位了
...全文
198 10 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
Phoenix_99 2010-02-03
  • 打赏
  • 举报
回复
你可以在AB的基础上建个视图,在视图上加instead of触发器,当insert视图的时候,选择是插A表还是B表。
chaoloveyou 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 ojuju10 的回复:]
还不如直接在程序里面控制

直接插入到b表中
[/Quote]
主要是我的程序都做完了,客户要求也不要改程序
doudou19861209 2010-02-03
  • 打赏
  • 举报
回复
create table a (id number, name varchar2(30));
create table b (id number, name varchar2(30));

create view va as
select id, name from a;

create or replace trigger trig_va
instead of insert on va
for each row
begin
if :new.name = 'zhangsan' then
insert into b values (:new.id, :new.name);
else
insert into a values (:new.id, :new.name);
end if;
end;
ngx20080110 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 chaoloveyou 的回复:]
引用 4 楼 ngx20080110 的回复:
SQL codecreatetable a (idnumber, namevarchar2(30));createtable b (idnumber, namevarchar2(30));createview vaasselect id, namefrom a;createorreplacetrigger trig_va
insteadofinserton vafor each rowbeginif :new.name='zhangsan'theninsertinto bvalues (:new.id, :new.name);elseinsertinto avalues (:new.id, :new.name);endif;end;insertinto vavalues (1,'zhangsan');insertinto vavalues (2,'lisi');select*from a;
        ID NAME---------- ---------------------------------------------2 lisiselect*from b;
        ID NAME---------- ---------------------------------------------1 zhangsan
這是ora-04091 table is mutating trigger function may not see it的問題,比較難處理。
現在還在研究不用視圖能否實現。

各位高手,我的程序已经做完,如果我在建立个试图的话,每个程序都要改,我现在只想用a表建立触发器往B表里面插
[/Quote]
往b表插入是沒問題的,關鍵是你要把a表插入的刪除就難辦了。
ojuju10 2010-02-03
  • 打赏
  • 举报
回复
还不如直接在程序里面控制

直接插入到b表中
chaoloveyou 2010-02-03
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 ngx20080110 的回复:]
SQL codecreatetable a (idnumber, namevarchar2(30));createtable b (idnumber, namevarchar2(30));createview vaasselect id, namefrom a;createorreplacetrigger trig_va
insteadofinserton vafor each rowbeginif :new.name='zhangsan'theninsertinto bvalues (:new.id, :new.name);elseinsertinto avalues (:new.id, :new.name);endif;end;insertinto vavalues (1,'zhangsan');insertinto vavalues (2,'lisi');select*from a;
ID NAME---------- ---------------------------------------------2 lisiselect*from b;
ID NAME---------- ---------------------------------------------1 zhangsan
這是ora-04091 table is mutating trigger function may not see it的問題,比較難處理。
現在還在研究不用視圖能否實現。
[/Quote]
各位高手,我的程序已经做完,如果我在建立个试图的话,每个程序都要改,我现在只想用a表建立触发器往B表里面插
ngx20080110 2010-02-02
  • 打赏
  • 举报
回复

create table a (id number, name varchar2(30));
create table b (id number, name varchar2(30));

create view va as
select id, name from a;

create or replace trigger trig_va
instead of insert on va
for each row
begin
if :new.name = 'zhangsan' then
insert into b values (:new.id, :new.name);
else
insert into a values (:new.id, :new.name);
end if;
end;

insert into va values (1, 'zhangsan');
insert into va values (2, 'lisi');

select * from a;
ID NAME
---------- ---------------------------------------------
2 lisi

select * from b;
ID NAME
---------- ---------------------------------------------
1 zhangsan

這是ora-04091 table is mutating trigger function may not see it的問題,比較難處理。
現在還在研究不用視圖能否實現。
crazylaa 2010-02-02
  • 打赏
  • 举报
回复
你可以在AB的基础上建个视图,在视图上加instead of触发器,当insert视图的时候,选择是插A表还是B表。
chaoloveyou 2010-02-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 java3344520 的回复:]
删除掉A表数据
[/Quote]
不好意思我是个新手,那问一下怎么删除呢,是否还有别的方法,
iqlife 2010-02-02
  • 打赏
  • 举报
回复
删除掉A表数据
相关推荐
发帖
Oracle 高级技术

3477

社区成员

Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
帖子事件
创建了帖子
2010-02-02 04:34
社区公告
暂无公告