2015-05-09 79 views
0

因此,我有一个任务,用于编写触发器,该触发器应该在更新SALARY列的记录中的两列之间交换数据 - LAST_NAME和EMAIL。这就是我想出了SQL触发错误报告

CREATE OR REPLACE TRIGGER SWAP 
    FOR UPDATE OF SALARY ON MY_EMP 
    COMPOUND TRIGGER 
    AFTER EACH ROW IS 
    BEGIN 
     UPDATE MY_EMP SET LAST_NAME = EMAIL, EMAIL = LAST_NAME WHERE :OLD.SALARY <> :NEW.SALARY; 
    END AFTER EACH ROW; 
END SWAP; 

,当我尝试执行此:

UPDATE MY_EMP 
SET SALARY = SALARY + 100 
WHERE EMPLOYEE_ID = 198; 

我发现了一个错误报告:

UPDATE MY_EMP 
SET SALARY = SALARY + 100 
WHERE EMPLOYEE_ID = 198 
Error report - 
SQL Error: ORA-04091: table PWR_14_15_L_013209985.MY_EMP is mutating, trigger/function may not see it 
ORA-06512: at "PWR_14_15_L_013209985.SWAP", line 4 
ORA-04088: error during execution of trigger 'PWR_14_15_L_013209985.SWAP' 
04091. 00000 - "table %s.%s is mutating, trigger/function may not see it" 
*Cause: A trigger (or a user defined plsql function that is referenced in 
     this statement) attempted to look at (or modify) a table that was 
     in the middle of being modified by the statement which fired it. 
*Action: Rewrite the trigger (or function) so it does not read that table. 

我在做什么错这里?任何解决方案

+1

错误消息清楚地解释了问题所在。你还想要我们说什么? – 2015-05-09 01:17:08

回答

0

更新前设置为a,而不是修改基础表,修改表的新值。

这将允许您在DML提交之前更新它们。