мутирует, триггер / функция может не видеть его - ошибка во время выполнения триггера - PullRequest
3 голосов
/ 08 июня 2010
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 ]

4 голосов
/ 08 июня 2010

Исключение «таблица является мутацией» возникает, когда триггер, определенный как FOR EACH ROW, пытается получить доступ к таблице, для которой был выполнен вызов. Том Кайт написал замечательное руководство по причинам и разрешению этого исключения здесь .

В вашем опубликованном примере у вас нет FOR EACH ROW, поэтому я не ожидаю, что будет возбуждено исключение. Обычно нужно использовать триггеры FOR EACH ROW только в тех случаях, когда необходимо получить доступ к значениям: OLD или: NEW каждой строки, которыми вы не являетесь.

0 голосов
/ 09 июня 2010

Это единственный у вас триггер? Ваш триггер обновляет таблицу TEST_TRNCOMPMST. Если в этой таблице есть триггер, который обращается к TEST_TRNCOMPVISIT, вы получите сообщение об ошибке.

...