变异,触发/功能可能看不到它 - 执行触发时出错

时间:2010-06-08 11:12:47

标签: sql oracle oracle9i ora-04091 ora-04088

CREATE OR REPLACE TRIGGER UPDATE_TEST_280510
AFTER insert on TEST_TRNCOMPVISIT
declare
V_TRNCOMPNO NUMBER(10);

CURSOR C1 IS SELECT B.COMPNO FROM TEST_TRNCOMPVISIT A, TEST_TRNCOMPMST B, 
                                  TEST_MEMMAST C
WHERE A.COMPNO=B.COMPNO 
AND B.TRNMEMID=C.MEMID 
AND C.MEMOS>=1000;

begin
open c1;
fetch c1 into V_TRNCOMPNO;


UPDATE TEST_TRNCOMPMST SET COMPSTATUS='P',
       remark='comp is pending due to O/S>1000'
WHERE COMPNO=V_TRNCOMPNO AND COMPSTATUS='C';
CLOSE C1;

end;

我已经创建了这个触发器,并且在表-TEST_TRNCOMPVISIT中插入行时会出现以下错误 -

发生以下错误:

  

ORA-04091:表TEST.TEST_TRNCOMPVISIT正在变异,触发/功能可能看不到它   ORA-06512:在“TEST.UPDATE_TEST_280510”,第4行   ORA-06512:在“TEST.UPDATE_TEST_280510”,第10行   ORA-04088:执行触发器'TEST.UPDATE_TEST_280510'时出错

2 个答案:

答案 0 :(得分:4)

当定义为FOR EACH ROW的触发器尝试访问被触发的表时,会引发“表正在变异”异常。 Tom Kyte撰写了一篇关于此异常的原因和解决方案的精彩指南here

在您发布的示例中,您没有FOR EACH ROW,所以我不希望引发异常。通常,只有在需要访问:OLD或:每行的NEW值时,才需要使用FOR EACH ROW触发器。

答案 1 :(得分:0)

这是你唯一的触发器吗? 您的触发器更新表TEST_TRNCOMPMST。如果此表上有触发器访问TEST_TRNCOMPVISIT,则会收到错误消息。