Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle löst Update an einem anderen Tisch aus

  1. Ein IF Anweisung benötigt ein THEN
  2. In PL/SQL verwenden Sie ein = um auf Gleichheit zu testen, nicht ==
  3. Sie müssen die Variablen deklarieren, die Sie auswählen

Wenn ich diese drei Dinge mache, bekomme ich so etwas:

create or replace trigger PASSENGER_BOOKING_T1
  AFTER insert on PASSENGER_BOOKING
  for each row
declare
  l_seat       flight.seat%type;
  l_flight_id  flight.flight_id%type;
begin
  IF (:NEW.CLASS_TYPE = 'ECO')
  THEN
    SELECT F.AVL_SEATS_ECOCLASS,F.FLIGHT_ID 
      INTO l_seat, l_flight_id
      FROM BOOKING B, 
           JOURNEY_FLIGHT J, 
           FLIGHT F 
     WHERE B.JOURNEY_ID = J.JOURNEY_ID 
       and F.FLIGHT_ID = J.FLIGHT_ID;

    UPDATE FLIGHT 
       SET AVL_SEATS_ECOCLASS = (l_seat-1)
     WHERE FLIGHT_ID = l_flight_id;   
  END IF;
end;​

Abgesehen von diesen Syntaxfehlern wäre ich schockiert, wenn die SELECT INTO aussage war richtig. A SELECT INTO muss genau 1 Zeile zurückgeben. Ihre Abfrage sollte mit ziemlicher Sicherheit mehrere Zeilen zurückgeben, da es keine Prädikate gibt, die die Abfrage auf einen bestimmten Flug oder eine bestimmte Buchung beschränken würden. Vermutlich möchten Sie einer oder mehreren Spalten im PASSENGER_BOOKING beitreten Tabelle.

Wenn es sich um etwas anderes als eine Hausaufgabe handelt, stellen Sie außerdem sicher, dass Sie verstehen, dass diese Art von Auslöser in einer Umgebung mit mehreren Benutzern nicht richtig funktioniert.