Почему триггеры псевдозаписей триггеров для переменных связывания в теле триггера, а не WHEN? - PullRequest
0 голосов
/ 10 мая 2019

Документация гласит:

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

: pseudorecord_name.field_name

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

Мой рабочий пример выглядит так:

CREATE OR REPLACE TRIGGER started
BEFORE UPDATE OF mgr_start_date ON department
FOR EACH ROW
WHEN (new.mgr_start_date < old.mgr_start_date)
BEGIN
    :new.mgr_start_date := :old.mgr_start_date;
    DBMS_OUTPUT.PUT_LINE('Rejected backdate of mgr_start_date.');
END;

Почему псевдокорды (имена корреляций) заполнители для переменных связывания в одном случае, а не в другом?

1 Ответ

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

«Неужели создатели Оракула захотят присоединиться?»

Я не один из создателей, но я все равно буду звонить.

Эти ссылки псевдозаписей не являются заполнителями для переменных связывания ...

WHEN (new.mgr_start_date < old.mgr_start_date)

... потому что эта строка является частью спецификации триггера. Это определяет условие срабатывания триггера. Он указывает имена полей, а не значения.

Эти ссылки на псевдокорд являются заполнителями ...

:new.mgr_start_date := :old.mgr_start_date;

... потому что они ссылаются на фактические значения из старой и новой версий записи.

...