Ошибка при создании триггера с использованием блока PL / SQL - PullRequest
1 голос
/ 22 марта 2020

Вопрос: fl_schedule (flno, отправление, dtime, прибывает, время, цена).

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

CREATE OR REPLACE TRIGGER flightsch_day
BEFORE INSERT OR UPDATE ON fl_schedule
FOR EACH ROW
WHEN (NEW.flno LIKE 'CX7520')
DECLARE 
    day NUMBER;
BEGIN
    day:=EXTRACT(weekday FROM :NEW.departs);
    IF day NOT IN(0,2,5) THEN  
        RAISE_APPLICATION_ERROR(-20000,'Flight number CX­7520 can be scheduled only on Tuesday, Friday and Sunday.');
    END IF;
END;
/

ОШИБКИ:

SQL> SHOW ERRORS;
Errors for TRIGGER FLIGHTSCH_DAY:

LINE/COL ERROR
-------- -----------------------------------------------------------------
4/10     PLS-00122: FROM as separator is allowed only with specific
         built-in functions

1 Ответ

3 голосов
/ 22 марта 2020

Чтобы иметь возможность использовать WHEN (NEW.flno = 'CX7520') после FOR EACH ROW, UPDATE OF flno необходимо для отдельного столбца flno

CREATE OR REPLACE TRIGGER flightsch_day
BEFORE INSERT OR UPDATE OF flno ON fl_schedule
FOR EACH ROW
WHEN (NEW.flno = 'CX7520')
DECLARE 
BEGIN
 IF TO_CHAR(:NEW.departs,'Dy','NLS_DATE_LANGUAGE=English') NOT IN ('Tue','Fri','Sun') THEN  
     RAISE_APPLICATION_ERROR(-20000,'Flight number CX­7520 can be scheduled only on Tuesday, Friday and Sunday.');
 END IF;
END;
/

или без этого WHEN.. предложение, возьмите :NEW.flno = 'CX7520' в IF Оператор:

CREATE OR REPLACE TRIGGER flightsch_day
BEFORE INSERT OR UPDATE ON fl_schedule
FOR EACH ROW
DECLARE 
BEGIN
 IF NOT ( TO_CHAR(:NEW.departs,'Dy','NLS_DATE_LANGUAGE=English') IN ('Tue','Fri','Sun')
              AND :NEW.flno = 'CX7520' ) THEN  
    RAISE_APPLICATION_ERROR(-20000,'Flight number CX­7520 can be scheduled only on Tuesday, Friday and Sunday.');
 END IF;
END;
/
  • используйте сокращения дня, содержащие опцию NLS_DATE_LANGUAGE. В противном случае вы можете столкнуться с неожиданными ситуациями.
  • отображаемая ошибка связана с использованием weekday в функции EXTRACT(), где допускается использование day, month, year для переменной типа даты, а также hour, minute, second ..et c. если допустима переменная типа datetime, но не weekday
...