触发器的意图:在更新某条记录后自动更改当前帐户的当前交易之后的所有交易记录的余额。比如:帐户1(帐目编号体现)有5次交易记录,现在修改该帐户第一次交易时的收入字段,则本次交易的余额应自动刷新,并且其后面4次的余额也要自动跟着刷新。
表结构及说明:
create table zmmx
(whbh      number(10)   primary key,      --交易编号--
 zmbh      varchar2(14),                  --帐目编号--    
 zmlb      number(2)    not null,         --帐目类别--
 whrq      date         not null,         --交易日期--
 kmbh      number(3),                     --科目编号--    
 srje      number(8,2),                   --收入金额-- 
 zcje      number(8,2),                   --支出金额--
 ye        number(8,2),                   --帐目余额--
 jzr       char(10),                      --记帐人-- 
 foreign key (zmbh) references zongz(zmbh),
 foreign key (kmbh) references kem(kmbh)); 
  
请高手指出下面触发器存在的问题,并指正!
CREATE OR REPLACE TRIGGER tri_change_zmmx BEFORE INSERT OR DELETE OR UPDATE ON zmmx FOR EACH ROW
declare
  v_lastye zmmx.ye%type;
  v_bdje zmmx.ye%type;
  v_whbh zmmx.whbh%type;
  v_zmbh zmmx.zmbh%type;
BEGIN
     v_lastye:=:old.ye;
     v_zmbh:=:old.zmbh;
     v_whbh:=:old.whbh;
    --用下面的一行可以自动改变当前记录的余额--
    :new.ye:=v_lastye+:new.srje-:old.srje+:old.zcje-:new.zcje;
    --下面想改变其他相关记录的余额,但是出错了!-- 
    v_bdje:=:new.ye-v_lastye;
     update zmmx set ye=ye+v_bdje where zmbh=v_zmbh and whbh>v_whbh;  
END tri_change;
/

解决方案 »

  1.   

    update zmmx set ye=ye+v_bdje where zmbh=v_zmbh and whbh>v_whbh;  --这样就循环触发了CREATE OR REPLACE TRIGGER tri_change_zmmx BEFORE INSERT OR DELETE OR UPDATE ON zmmx FOR EACH ROW
    declare
      v_lastye zmmx.ye%type;
      v_bdje zmmx.ye%type;
      v_whbh zmmx.whbh%type;
      v_zmbh zmmx.zmbh%type;
    BEGIN
         v_lastye:=:old.ye;
         v_zmbh:=:old.zmbh;
         v_whbh:=:old.whbh;
        --用下面的一行可以自动改变当前记录的余额--
        if inserting or updating then
        :new.ye:=v_lastye+:new.srje-:old.srje+:old.zcje-:new.zcje;
        --下面想改变其他相关记录的余额,但是出错了!-- 
        v_bdje:=:new.ye-v_lastye;
         :new.ye=:new.ye+v_bdje;
        end if;
    END tri_change;
    /
      

  2.   

    试着把before 改成 after试试!!!