如何避免获取ORACLE Mutating触发器错误

时间:2013-10-10 09:30:40

标签: oracle

我在插入后创建了更新oracle数据库表的触发器。

CREATE OR REPLACE TRIGGER Update_ACU     
  AFTER INSERT ON TBL_ACU      
  FOR EACH ROW    
BEGIN       
  UPDATE TBL_ACU     
  SET    CURRENCY = 'XXX'    
  WHERE  ACCOUNT like '%1568';   
END ;


I inserted record as

insert into TBL_ACU values('23','USD','1231568');

我得到表ORACLE Mutating触发器错误。

请帮我解决此问题。

2 个答案:

答案 0 :(得分:0)

好吧,如果在修改该表时调用触发器,则无法从触发器修改表。这个问题有各种解决方案,包括{/ 1}}触发器和PL / SQL PACKAGE中定义的某些集合中的缓存修改,但在您的情况下,我宁愿将触发器的主体更改为:

AFTER STATEMENT

您可以在触发器内使用BEGIN IF :NEW.ACCOUNT LIKE '%1568' THEN :NEW.CURRENCY := 'XXX'; END IF; END; :NEW变量,相应地识别记录的 new old 值。修改:OLD记录的值将导致实际插入数据库的数据发生变化。

答案 1 :(得分:0)

最好使用BEFORE INSERT触发器来执行此操作。

试试这个,

CREATE OR REPLACE 
TRIGGER update_acu
     BEFORE INSERT ON tbl_acu
     FOR EACH ROW
     WHEN (NEW.ACCOUNT LIKE '%1568')
BEGIN
     :NEW.currency := 'XXX';
END ;