Строковый триггер запускается один раз для каждой строки, обрабатываемой активизирующим оператором. Внутри триггера можно обращаться к данным строки, обрабатываемой в данный момент. Для этого служат два идентификатора корреляции — : old и : new. Идентификатор корреляции (correlation identifier) — это переменная привязки PL/SQL особого рода. Двоеточие перед идентификатором указывает на то, что это переменные привязки (подобны базовым переменным, используемым во встроенном PL/SQL), а не обычные переменные PL/SQL. Компилятор PL/SQL pac-сматривает их как записи типа
Внимание
Псевдозапись : old не определена для операторов INSERT, а для операторов DELETE не определена псевдозапись : new. В случае использования .о1бв операторе INSERT или: new в операторе DELETE компилятор PL/SQL не будет генерировать ошибку, но значения полей обеих записей будут NULL.
В определен еще один идентификатор корреляции — : parent.
-eJ Если триггер создается для вложенной таблицы, : old и : new ссылаются на ее строки, а : parent — на текущую строку родительской таблицы
(см. документацию Oracle).
GenerateNewStudentID модифицирует значение : new. ID. Это одно из полезных свойств : new — когда выполнение оператора завершается, используются те значения, которые содержатся в : new. С помощью триггера GenerateNewStudentID можно выполнить оператор:
Ошибка при этом не возникает. Хотя значение для столбца ID, являющегося первичным ключом, указано не было (что обязательно), оно будет введено триггером. Если указать значение ID, оно будет проигнорировано, так как триггер его изменит. Если выполнить оператор
то в столбец ID будет введено значение student_sequence. NEXTVAL, а не -7.
Именно поэтому нельзя изменить : new в строковом триггере AFTER, так как оператор будет обработан раньше. Вообще говоря, : new модифицируется только в строковых триггерах BEFORE; ; old никогда не модифицируется, а лишь считывается.
Записи : new и : old разрешается использовать только в строковых триггерах. Если указать из них в операторном будет выдана ошибка компиляции. Поскольку операторный триггер выполняется
лишь однажды (даже в том случае, когда в операторе обрабатывается несколько строк), псевдозаписи : old и : new не имеют никакого смысла. Действительно, на какую из строк будет ссылаться каждая из них?
лишь однажды (даже в том случае, когда в операторе обрабатывается несколько строк), псевдозаписи : old и : new не имеют никакого смысла. Действительно, на какую из строк будет ссылаться каждая из них?
Псевдозаписи Хотя : new и : old синтаксически рассматриваются в качестве записей типа. Приведем пример:
< Предыдущая | Следующая > |
---|