日期:2014-05-17  浏览次数:20667 次

请问怎样用触发器来做及时更新?
各位大虾:    
  小弟现有一个问题请各位高人帮忙解决,我有一个表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;    


------解决方案--------------------
触发器不需要用 commit; 的
具体报错是什么?
------解决方案--------------------
p_no:=:new.code; → p_no:=:old.code;
试下看
------解决方案--------------------
你的问题属于triggr中的变异表问题
简单说:

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