永发信息网

如何在触发器里写:当一张表被更新时,更新它关联的一张表

答案:1  悬赏:10  手机版
解决时间 2021-03-29 07:27
  • 提问者网友:树红树绿
  • 2021-03-29 00:51
如何在触发器里写:当一张表被更新时,更新它关联的一张表
最佳答案
  • 五星知识达人网友:大漠
  • 2021-03-29 01:08
哎。。。刚开完会,不然早就弄好了,给你加了会儿班,呵呵。
环境—oracle
最不理想的就是行级触发器里面不用使用select原表等操作,而表级触发器又不能用:new和:old,
所以只能这样判断update、insert、delete来实现,否则得使用行级和表级和中间表才能实现,比较麻烦了。
--建表:
create table system.zhidao_20131014_tab2_1
(
       HEAD_ID  varchar2(10),
       LINE_ID  varchar2(10),
       QTY  number
);
create table system.zhidao_20131014_tab2_2
(
       HEAD_ID  varchar2(10),
       SUMQTY  number
);
--造数:
insert into system.zhidao_20131014_tab2_1
select 'H1','1',100 from dual
union all
select 'H1','2',200 from dual
union all
select 'H1','2',300 from dual
union all
select 'H1','2',100 from dual;

insert into system.zhidao_20131014_tab2_2
select 'H1',700 from dual;
commit;
--触发器:
create or replace trigger tr_zhidao
after insert or update or delete
on system.zhidao_20131014_tab2_1
for each row
begin
  case
    when updating then
      update system.zhidao_20131014_tab2_2 t set SUMQTY=SUMQTY - :old.QTY + :new.QTY where t.head_id=:new.head_id;
    when inserting then
      update system.zhidao_20131014_tab2_2 t set SUMQTY=SUMQTY + :new.QTY where t.head_id=:new.head_id;
    when deleting then
      update system.zhidao_20131014_tab2_2 t set SUMQTY=SUMQTY - :old.QTY where t.head_id=:old.head_id;
  end case;
end;
--测试:
--insert
insert into system.zhidao_20131014_tab2_1 
select 'H1','3',300 from dual;
--delete
delete system.zhidao_20131014_tab2_1 where HEAD_ID='H1' and LINE_ID='3';
--update
update system.zhidao_20131014_tab2_1 set QTY=1000 where QTY=300;有问题再追问,望采纳啊。
追问不好意思,是SQL SERVER,忘了说了追答create trigger tr_zhidao
on system.zhidao_20131014_tab2_1
for insert,update,delete
as
declare @oldQTY number,@newQTY number,@oldHID varchar2(10),@newHID varchar2(10);
begin
  if ((exists (select 1 from inserted)) and (exists (select 1 from deleted)))
    begin
      select @newQTY=QTY,@newHID=head_id from inserted; 
      select @oldQTY=QTY from deleted;
      update system.zhidao_20131014_tab2_2 t set SUMQTY=SUMQTY - @oldQTY + @newQTY where t.head_id=@newHID;
    end
  else if (exists (select 1 from inserted) and not exists (select 1 from deleted))
    begin
      select @newQTY=QTY,@newHID=head_id from inserted; 
      update system.zhidao_20131014_tab2_2 t set SUMQTY=SUMQTY + @newQTY where t.head_id=@newHID;
    end
  else if (not exists (select 1 from inserted) and exists (select 1 from deleted))
    begin
      select @oldQTY=QTY,@oldHID=head_id from deleted;
      update system.zhidao_20131014_tab2_2 t set SUMQTY=SUMQTY - @oldQTY where t.head_id=@oldHID;
    end
end
我要举报
如以上回答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
点此我要举报以上问答信息
大家都在看
推荐资讯