Mise à jour des déclencheurs Oracle à une autre table

J'essaie de créer un déclencheur dans Oracle. Je connais SQL mais je n'ai jamais créé de déclencheur auparavant. J'ai ce code:

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

Ce déclencheur se déclenche en cas d'insertion dans la table Passenger_Booking. Et le nombre de places assises est réduit de un (qui est à table différente).

La requête de sélection devrait bien se passer, mais il y a quelque chose qui ne va pas quelque part. Quelqu'un pourrait-il suggérer quelque chose?

J'ai changé la partie du corps à cela, mais j'ai toujours des problèmes:

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éponses

  1. Une instruction IF nécessite un THEN
  2. Dans PL/SQL, vous utilisez un = pour tester l'égalité, pas ==
  3. Vous devez déclarer les variables que vous sélectionnez dans

Quand je fais ces trois choses, je reçois quelque chose comme ça

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

Au-delà de ces erreurs de syntaxe, je serais choqué si l’instruction SELECT INTO était correcte. Un SELECT INTO doit renvoyer exactement 1 ligne. Votre requête devrait presque certainement renvoyer plusieurs lignes car il n'y a pas de prédicats qui limiteraient la requête à un vol ou à une réservation en particulier. Vous souhaitez probablement rejoindre une ou plusieurs colonnes de la table PASSENGER_BOOKING .

En outre, s'il ne s'agit pas d'un devoir, assurez-vous de bien comprendre que ce type de déclencheur ne fonctionne pas correctement dans un environnement multi-utilisateur.

4
ajouté
Je ne peux pas voter assez cette explication
ajouté l'auteur bpgergo, source

juste une conjecture sauvage

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
ajouté
Cela me donne toujours cette erreur: PLS-00103: Le symbole "=" est rencontré lorsque l'un des éléments suivants est attendu: (- + all case mod new null
ajouté l'auteur Ataman, source
OK, j'ai édité une faute de frappe dedans
ajouté l'auteur bpgergo, source