Неправильное использование переменной связывания в КОГДА триггера - PullRequest
2 голосов
/ 27 апреля 2019

Я довольно новичок в SQL и пытаюсь настроить TRIGGER для своего упражнения. Я не могу найти решение. Вот код:

CREATE TRIGGER C3
BEFORE UPDATE OF rate ON Magazines
FOR EACH ROW
WHEN(:NEW.rate < :OLD.rate*0.75)
BEGIN
    IF :NEW.rate < 0 THEN
        :NEW.rate = 0;
        RAISE_APPLICATION_ERROR(-20003, 'Rate should never be below 0.');
    ELSE
        :NEW.rate = :OLD.rate*0.75;
END;
/

Когда я пытаюсь скомпилировать, он показывает мне эту ошибку: Non valid use of bind variable in WHEN of a trigger

Я пытался удалить : до NEW и OLD, но вместо этого он дает мне еще одну ошибку компилятора.

Есть идеи? Большое спасибо!

Ответы [ 2 ]

2 голосов
/ 27 апреля 2019

Операция присваивания в pl / sql: =

CREATE TRIGGER C3
BEFORE UPDATE OF rate ON Magazines
FOR EACH ROW
WHEN(:NEW.rate < :OLD.rate*0.75)
BEGIN
    IF :NEW.rate < 0 THEN
        :NEW.rate := 0;
        RAISE_APPLICATION_ERROR(-20003, 'Rate should never be below 0.');
    ELSE
        :NEW.rate := :OLD.rate*0.75;
END;
0 голосов
/ 10 мая 2019

Сначала необходимо удалить двоеточия только из предложения WHEN. Тогда вам также понадобятся двоеточия перед знаками равенства для назначения в теле триггера.

CREATE TRIGGER C3
BEFORE UPDATE OF rate ON Magazines
FOR EACH ROW
WHEN(NEW.rate < OLD.rate*0.75)
BEGIN
    IF :NEW.rate < 0 THEN
        :NEW.rate := 0;
        RAISE_APPLICATION_ERROR(-20003, 'Rate should never be below 0.');
    ELSE
        :NEW.rate := :OLD.rate*0.75;
END;
/

Согласно документации :

В trigger_body простого триггера или в tps_body составного триггера имя корреляции является заполнителем для переменной связывания. Ссылка на поле псевдокорда с этим синтаксисом:

: pseudorecord_name.field_name

В предложении WHEN условного триггера имя корреляции не является заполнителем для переменной связывания. Поэтому пропустите двоеточие в предыдущем синтаксисе.

...