Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Aktualizacja wyzwalaczy Oracle przy innym stole

  1. IF instrukcja wymaga THEN
  2. W PL/SQL używasz = testować pod kątem równości, a nie ==
  3. Musisz zadeklarować zmienne, które wybierasz

Kiedy robię te trzy rzeczy, otrzymuję coś takiego

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;​

Poza tymi błędami składni byłbym zszokowany, gdyby SELECT INTO stwierdzenie było poprawne. SELECT INTO musi zwrócić dokładnie 1 wiersz. Twoje zapytanie powinno prawie na pewno zwrócić wiele wierszy, ponieważ nie ma predykatów, które ograniczałyby zapytanie do konkretnego lotu lub konkretnej rezerwacji. Przypuszczalnie chcesz dołączyć do jednej lub więcej kolumn w PASSENGER_BOOKING tabeli.

Dodatkowo, jeśli jest to coś innego niż zadanie domowe, upewnij się, że rozumiesz, że ten rodzaj wyzwalacza nie działa poprawnie w środowisku wielu użytkowników.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Scalanie CTE Oracle

  2. Błąd Oracle 11.1 konwertujący numer dnia juliańskiego na DATE lub TIMESTAMP

  3. Magia DUAL

  4. ORA-12154 nie może rozpoznać podanego identyfikatora połączenia

  5. Dlaczego Hibernate zgłasza org.hibernate.exception.LockAcquisitionException?