В Oracle вы можете написать триггер уровня, указав предложение FOR EACH ROW в инструкции CREATE TRIGGER:
CREATE TRIGGER MY_FANCY_TRIGGER
BEFORE UPDATE ON MY_TABLE
FOR EACH ROW
BEGIN
IF :OLD.my_id_column > 4 AND :NEW.some_other_column <> 'foo' THEN
-- ...
END IF;
END;
Такой триггер позволяет просматривать версии до и после каждой затронутой строки (:OLD и :NEW соответственно). Например, следующий оператор заставит этот триггер выполнить один раз для каждой строки в MY_TABLE:
UPDATE MY_TABLE SET some_other_column = 'bar';
Исключив предложение FOR EACH ROW, триггер становится триггером уровня инструкций. Это означает, что он выполняется только один раз за оператор, независимо от того, сколько строк (если они есть) повлияло на оператор. К сожалению, триггеры уровня инструкций не имеют доступных переменных :OLD и :NEW (потому что количество затронутых строк много меняется).
Можно ли получить значения :OLD и :NEW для всех затронутых строк внутри триггера на уровне инструкций? У меня есть некоторая обработка, которую я бы предпочел только раз за один оператор.