4
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'

4

2 回答 2

4

当定义为 FOR EACH ROW 的触发器尝试访问被触发的表时,会引发“表正在变异”异常。Tom Kyte 在这里写了一个关于这个异常的原因和解决方法的很好的指南。

在您发布的示例中,您没有 FOR EACH ROW,因此我不希望引发异常。通常只需要在需要访问每一行的 :OLD 或 :NEW 值的情况下使用 FOR EACH ROW 触发器,而您不需要。

于 2010-06-08T12:08:19.940 回答
0

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

于 2010-06-09T11:15:43.623 回答