有一表,结构为:id name je1 je2 je,想做一触发器,在插入或更新数据时只插入或更新je1和je2,然后通过触发器将je1+je2的和插入或更新到je字段中,现将我写的考下:
create or replace trigger a_tig
after insert or update  on aaa for each rowdeclare 
tid number;
begin
     tid:=:old.id;
    
     update aaa  set je =:new.je1+je2 where id=tid;
 
end;
编译通过,但调用时出错,说是表发生变化,但触发器或函数不能读它,错误代码ORA-04091,就在更新语句行出错。好久没用过了,不知咋回事,求教……

解决方案 »

  1.   

    更新-触发-再更新,形成了循环,所以,oracle不让。不用触发器,更新的时候 update aaa set je=je1+je2,je1=:je1,je2=:je2 where id=...
      

  2.   


    --对本表的自操作要加上自治的事务!create or replace trigger a_tig
    after insert or update on aaa for each row
    pragma autonomous_transaction;
    declare  
    tid number;
    begin
      tid:=:old.id;
        
      update aaa set je =:new.je1+je2 where id=tid;
     
    end;
      

  3.   

    按你的需求完全没有必要在触发器中使用UPDATE,直接修改new中的值就可以了create or replace trigger a_tig
    before insert or update on aaa for each rowdeclare  
    begin
         
      new.je := new.je1 + new.je2;
     
    end;
      

  4.   


     CREATE OR REPLACE TRIGGER a_tig
    BEFORE INSERT OR UPDATE OF je ON aaa
    FOR EACH ROW
    BEGIN
    if ( :new.je= 0 or :new.jeis null ) then
    SELECT new.je1 + new.je2 into :new.je from dual;
    end if;
    END;