2017-01-25 1 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; 
/

Dieser Trigger gibt Mutating Fehler, bitte helfen Sie es zu beheben.Oracle Trigger Muating Fehler

+0

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

+0

Mögliches Duplikat von [ORACLE After Update-Trigger: ORA-04091 zu lösen Muting-Tabellenfehler] (http://stackoverflow.com/questions/6915325/oracle-after-update-trigger-solving-ora-04091-mutating-table-error) –

Antwort

1

Ihr Auslöser enthält eine Auswahl gegen den Tisch ausgeführt, die den Trigger hat:

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

Oracle Datenbank-Operationen erfordern vorhersagbar Zustand. Das Ergebnis dieser Auswahl ist unvorhersehbar, da Sie sich in der Mitte der Transaktion befinden: Die Daten wurden noch nicht angewendet. Der Trigger schlägt also mit dem Mutationsfehler fehl.

In diesem Fall scheint es, alles, was Sie tun müssen, ist

flagtemp := :new.flag; 

Oder, noch besser, zu tun, weg mit der Zuordnung, da Sie nicht die lokale Variable in den Rest des Trigger verwenden.