Oracle Triggers Update la alt tabel

Încerc să creez un declanșator în Oracle. Știu sql, dar nu am creat niciodată declanșator. Am acest cod:

create or replace trigger "PASSENGER_BOOKING_T1"
AFTER
insert on "PASSENGER_BOOKING"
for each row
begin
IF (:NEW.CLASS_TYPE == 'ECO')

SELECT F.AVL_SEATS_ECOCLASS,F.FLIGHT_ID INTO SEAT, FLIGHT_INFO 
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 = (SEAT-1)
WHERE FLIGHT_ID = FLIGHT_INFO;

END IF;
end;​

Acest declanșator se declanșează atunci când există o inserție în tabelul Passenger_Booking. Capacitatea de ședere este redusă cu una (care se află la o masă diferită).

Selectați interogarea ar trebui să fie în regulă, dar există ceva în neregulă într-un loc undeva. Ar putea sugera cineva ceva?

Am schimbat partea corpului în această problemă, dar încă am avut probleme:

UPDATE FLIGHT 
SET AVL_SEATS_ECOCLASS =
  (SELECT F.AVL_SEATS_ECOCLASS FROM BOOKING B, JOURNEY_FLIGHT J, FLIGHT F WHERE B.JOURNEY_ID = J.JOURNEY_ID and F.FLIGHT_ID = J.FLIGHT_ID;
);
1

2 răspunsuri

  1. O instrucțiune IF are nevoie de THEN
  2. În PL/SQL, folosiți un = pentru a testa egalitatea, nu ==
  3. Trebuie să declare variabilele pe care le selectați în

Când fac aceste trei lucruri, am ceva de genul asta

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

Dincolo de aceste erori de sintaxă, aș fi șocat dacă instrucțiunea SELECT INTO a fost corectă. Un SELECT INTO trebuie să returneze exact un rând. Întrebarea dvs. ar trebui să întoarcă aproape cu siguranță mai multe rânduri, deoarece nu există predicate care să restricționeze interogarea la un anumit zbor sau o anumită rezervare. Probabil doriți să vă alăturați la una sau mai multe coloane din tabela PASSENGER_BOOKING .

În plus, dacă acest lucru este altceva decât o sarcină de acasă, asigurați-vă că înțelegeți că acest tip de declanșator nu funcționează corect într-un mediu pentru mai mulți utilizatori.

4
adăugat
Nu pot explica suficient această explicație
adăugat autor bpgergo, sursa

doar o idee sălbatică

edit as Justin pointed out (thanks Justin) equality check

create or replace trigger "PASSENGER_BOOKING_T1"
AFTER
insert on "PASSENGER_BOOKING"
for each row
declare
   v_flight_id  FLIGHT.FLIGHT_ID%TYPE;
begin
IF (:NEW.CLASS_TYPE = 'ECO') THEN

SELECT F.ID into v_flight_id
FROM BOOKING B, JOURNEY_FLIGHT J, FLIGHT F 
WHERE B.ID = :NEW.BOOKING_ID -- note that I've made this up
AND B.JOURNEY_ID = J.JOURNEY_ID AND F.FLIGHT_ID = J.FLIGHT_ID;

UPDATE FLIGHT 
SET AVL_SEATS_ECOCLASS = (SEAT-1)
WHERE ID = v_flight_id;

END IF;
end;​
1
adăugat
Încă mai dă-mi această eroare: PLS-00103: A întâmpinat simbolul "=" atunci când se așteaptă una dintre următoarele: (- + all case mod new null
adăugat autor Ataman, sursa
Bine, am editat o tipografie în ea
adăugat autor bpgergo, sursa