Обновление триггеров Oracle за другим столом - PullRequest
1 голос
/ 13 ноября 2011

Я пытаюсь создать триггер в Oracle.Я знаю sql, но я никогда не создавал триггер раньше.У меня есть этот код:

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

Этот триггер срабатывает, когда есть вставка в таблице Passenger_Booking.А количество посадочных мест уменьшается на единицу (что за другим столом).

Выборочный запрос должен быть в порядке, но где-то что-то не так.Кто-нибудь может предложить что-нибудь?

Я изменил часть тела на это, но все еще возникают проблемы:

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

Ответы [ 2 ]

4 голосов
/ 13 ноября 2011
  1. Для оператора IF требуется THEN
  2. В PL / SQL вы используете = для проверки на равенство, а не ==
  3. Вам нужно объявить переменные, которые вы выбираете, в

Когда я делаю эти три вещи, я получаю что-то вроде этого

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

Помимо этих синтаксических ошибок, я был бы шокирован, если бы выражение SELECT INTO было правильным. SELECT INTO должен возвращать ровно 1 строку. Ваш запрос почти наверняка вернет несколько строк, поскольку нет предикатов, которые бы ограничивали запрос конкретным рейсом или конкретным бронированием. Предположительно, вы хотите присоединиться к одному или нескольким столбцам в таблице PASSENGER_BOOKING.

Кроме того, если это не домашнее задание, убедитесь, что вы понимаете, что такого рода триггер не работает правильно в многопользовательской среде.

1 голос
/ 13 ноября 2011

просто дикая догадка

edit , как Джастин указал (спасибо Джастину) проверку на равенство

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;​
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...