Oracle PL/SQL: Aufruf einer Prozedur aus einem trigger

Ich bekomme diese Fehlermeldung immer wenn ich versuche auf das Feuer ein trigger nach dem einfügen auf Tabelle Passagiere. dieser Auslöser soll eine Prozedur aufrufen, die zwei Parameter nimmt der neu eingefügten Werte und basiert auf, dass es updates eine weitere Tabelle, die die Buchungs-Tabelle. ich bin jedoch immer diese Fehlermeldung:

ORA-04091: table AIRLINESYSTEM.PASSENGER is mutating, trigger/function may not see it 
 ORA-06512: at "AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE", line 11 ORA-06512: at 
"AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE", line 15 ORA-06512: at 
 "AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE_T1", line 3 ORA-04088: error during execution of 
  trigger 'AIRLINESYSTEM.CALCULATE_FLIGHT_PRICE_T1' (Row 3)

Ich befolgt und getestet, die Prozedur in der SQL-Befehlszeile und es funktioniert gut. Das problem scheint mit dem trigger. Dies ist der trigger-code:

create or replace trigger "CALCULATE_FLIGHT_PRICE_T1"
AFTER
insert on "PASSENGER"
for each row

begin

CALCULATE_FLIGHT_PRICE(:NEW.BOOKING_ID);

end;​​​​​

Warum ist der trigger nicht, der die Prozedur aufruft?

  • ORA-04091 sagt Ihnen, dass Sie ändern / Abfragen der Daten von Tabelle PASSENGERS im Verfahren CALCULATE_FLIGHT_PRICE - und das ist illegal.
  • Ich aktualisierte den Auslöser und bekomme immer noch den gleichen Fehler
  • Ich habe das Verfahren
  • Was @haki gesagt ist, dass Sie Abfragen, die gleichen, Sie haben einen Auslöser. So, nach dem einlegen einer Daten auf PASSAGIER-Tabelle der Auslöser ist die Abfrage der sable Tabelle auf SELECT dob from passenger WHERE booking_id = p_bookingid; - und dies ist nur illegal die Daten nicht begangen, aber, und Sie versuchen, das abrufen von Daten aus es.
  • Aber, ich habe mein trigger zum aufrufen der Prozedur nach einem insert auf Tabelle Passagiere
  • Das ist, was das problem ist! Du bist das einfügen einer Zeile zu passengers Tabelle, auf die ein trigger ausgeführt wird, das eine gespeicherte Prozedur aufruft, die wiederum SELECTs aus der "Passagiere" - Tabelle. SELECTing aus einer Tabelle, während es ausgeführt wird DMLs werden, ist verboten. Sie kann eine SELECT auf passengers Tabelle von überall auf der trigger, als auch von den Prozeduren oder Funktionen aufgerufen wird, von der trigger.
  • Rufen Sie nicht die Verfahren for each row - entfernen dieser Klausel aus dem trigger Erklärung, und es sollte funktionieren.

InformationsquelleAutor Wabbit | 2013-12-30
Schreibe einen Kommentar