sql >> Base de Datos >  >> RDS >> Oracle

Oracle activa la actualización en otra mesa

  1. Un IF declaración necesita un THEN
  2. En PL/SQL, usa un = para probar la igualdad, no ==
  3. Debe declarar las variables que está seleccionando

Cuando hago esas tres cosas, obtengo algo como esto

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

Más allá de esos errores de sintaxis, me sorprendería que SELECT INTO declaración era correcta. A SELECT INTO debe devolver exactamente 1 fila. Es casi seguro que su consulta devuelva varias filas, ya que no hay predicados que restrinjan la consulta a un vuelo en particular o una reserva en particular. Presumiblemente, desea unirse a una o más columnas en PASSENGER_BOOKING mesa.

Además, si se trata de algo más que una tarea, asegúrese de comprender que este tipo de disparador no funciona correctamente en un entorno multiusuario.