IF (: old.actDepartDateTime IS NULL) ТОГДА - PullRequest
1 голос
/ 25 мая 2019

резервирует идентификатор рейса, номер билета и номер места для любого удаленного билета, если билет соответствует рейсу, который еще не вылетел.

CREATE SEQUENCE generateKey НАЧАТЬ С 100 INCREMENT BY 1;

CREATE TABLE backUpTicket
(
cancelledKey NUMBER NOT NULL,
flightID char(9) NOT NULL,
ticketNum varchar2(5) NOT NULL,
seatNum NUMBER(3) NOT NULL,
PRIMARY KEY(cancelledKey)
);

CREATE OR REPLACE TRIGGER backUpTicketCancelled
BEFORE DELETE ON FLIGHT
FOR EACH ROW

BEGIN
    INSERT INTO backUpTicket
    VALUES
    (generateKey.nextVal, :old.flightID, :old.TicketNum, :old.seatNum);

    IF(:old.actDepartDateTime IS NULL) THEN
        DBMS_OUTPUT.PUT_LINE('The Flight has not departed yet');
    END IF;

END backUpTicket;
/       

ошибка, возникающая в IF (: old.actDepartDateTime IS NULL) в качестве оператора плохого связывания

Ответы [ 2 ]

3 голосов
/ 25 мая 2019

Во-первых, ваш триггер должен быть в таблице TICKET, а не в таблице FLIGHT.Во-вторых, вы не должны создавать резервную копию билета, если рейс уже вылетел.Ваш код всегда создает резервную копию.Я полагаю, что следующее может работать лучше:

CREATE OR REPLACE TRIGGER backUpTicketCancelled
  BEFORE DELETE ON TICKET
  FOR EACH ROW
DECLARE
  rowFlight  FLIGHT%ROWTYPE;
BEGIN
  SELECT *
    INTO rowFlight
    FROM FLIGHT f
    WHERE f.FLIGHTID = :OLD.FLIGHTID;

  IF rowFlight.actDepartDateTime IS NULL THEN
    INSERT INTO backUpTicket
        (CANCELLEDKEY,        FLIGHTID,      TICKETNUM,      SEATNUM)
      VALUES
        (generateKey.nextVal, :old.flightID, :old.TicketNum, :old.seatNum);
  ELSE
    DBMS_OUTPUT.PUT_LINE(TO_CHAR(SYSDATE', 'DD-MON-YYYY HH24:MI:SS') || ': ' ||
        'Flight ' || :OLD.FLIGHTID || ' departed at ' ||
        TO_CHAR(rowFlight.actDepartDateTime, 'DD-MON-YYYY HH24:MI:SS' ||
        ' so ticket #' || :OLD.TICKETNUM || ' for seat #' || :OLD.SEATNUM ||
        ' is not eligible for backup');
  END IF;    
END backUpTicket;

Кроме того, имя таблицы резервной копии должно быть BACKUP_TICKET, а не backUpTicket, так что вы, вероятно, будете помечены для этого.

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

Удачи.

1 голос
/ 25 мая 2019

Из ваших комментариев ваш триггер находится в таблице TICKET, но столбец actDepartDateTime находится в таблице FLIGHT.Вы можете получить доступ только к столбцам из таблицы триггера, используя :OLD и :NEW.Чтобы получить actDepartDateTime, вам необходимо выбрать из таблицы FLIGHT значение :OLD.flightID.

...