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

「table is mutating」例外は、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 に答える