2017-01-25 3 views
0
CREATE OR REPLACE TRIGGER Testtriger 
    after insert ON table2 referencing new as new old as old 
    for each row 
declare 
    flagtemp varchar2(1); 
begin 
    select flag into flagtemp from table2 where docid = :new.docid; 
    --if :new.cardtypeflag = 'T' then 
    update table1 set col1 = 'F' , col2= 'T', inactive = 'T', col3 = 'T' 
    where tabid = :new.docid; 
    --end if; 
end; 
/

Этот триггер дает ошибку мутации, пожалуйста, помогите исправить ошибку.Ошибка запуска спутника Oracle

+0

http://dba.stackexchange.com/questions/5432/what-are-the-causes-and-solutions-for-mutating-table-errors – GurV

+0

Возможный дубликат [ORACLE После запуска обновления: решение ORA-04091 ошибка с изменением таблицы] (http://stackoverflow.com/questions/6915325/oracle-after-update-trigger-solving-ora-04091-mutating-table-error) –

ответ

1

Ваш триггер содержит отборный выполняются по таблице, которая имеет триггер:

select flag into flagtemp from table2 where docid = :new.docid; 

операция с базами данных Oracle требует предсказуемого состояния. Результат этого выбора непредсказуем, потому что вы находитесь в середине транзакции: данные еще не были применены. Таким образом, триггер с ошибкой мутации.

В этом случае, кажется, все, что вам нужно сделать, это

flagtemp := :new.flag; 

Или, еще лучше, покончит с назначением, так как вы не используете локальную переменную в остальной части спускового крючка.