各位大虾:  
  小弟现有一个问题请各位高人帮忙解决,我有一个表A,我要将表B的数据在表A做Insert操作后即时写入表A的对应字段,两表之间用编码进行关联,且保证在表A新增前表B已有相应的数据.可我写了个触发器来做,ORACLE会报错.源代码如下(编译能通过):  
CREATE  OR  REPLACE  TRIGGER  UPDATE_A  
AFTER  INSERT  
ON  A    
FOR  EACH  ROW  
declare    
     p_no  char(7);  
     p_x  number(10,4);  
     p_y  number(10,4);  
begin  
                     p_no:=:new.code;  
             select  x,y  into  p_x,p_y  from  B  where  no=p_no;  
             update  A  set  x=p_x,y=p_y  where  code=p_no;  
             commit;  
             delete  from  B  where  no=p_no;  
             commit;  
end;  

解决方案 »

  1.   

    触发器不需要用  commit;  的
    具体报错是什么?
      

  2.   

    我现在已将commit去掉了,报错的信息很多:ORA-04091:table A is mutating,trigger/function may not see it ORA-06512:
    at "A",line 9....
      

  3.   

    p_no:=:new.code;  → p_no:=:old.code;  
    试下看
      

  4.   

    你的问题属于triggr中的变异表问题
    简单说:ORA-4091错误是在点火触发器时引发的而不是在创建该表时引发的!!!   
      要消除变化表的错误,不能用行级触发器中查询它,但可以在语句级触发器中查询它。   
      解决办法:创建两个触发器,一个行级触发器,另一个语句级触发器。差不多了。
    因为在使用行级触发的时候,该表成了变异表,这时候不能对该表进行操作. 要操作该表,需要使用表级触发器,并定义一变量.来保存变化的值.
      

  5.   

    to tgm78(shop34161266.taobao.com) :谢谢你的说明,但能否给个例子.
      

  6.   

    在触发器中不能对触发表直接进行数据修改.在你的触发器中不能对A进行update操作.