Как уже было сказано выше, триггеры уровня оператора могут быть от одного до нескольких изменений строки, поэтому: new и: old недоступны.
Если вам нужно отслеживать значения: new и: old и вам нужен доступ к ним в триггере оператора, вы можете создать триггер уровня строки, который хранит новые и старые значения для использования уровнем оператора. Вот один способ, которым мы решили эту проблему до
Пакет:
create or replace package table_trigger_helper is
subtype subtype_rowtype is table_name$rowtype;
type table_rowtype is table of subtype_rowtype;
v_old table_rowtype := table_rowtype();
v_new table_rowtype := table_rowtype();
end table_trigger_helper;
/
Триггер уровня строки:
create or replace trigger row_level_trigger_name
after insert or delete or update
on table_name
for each row
declare
r_old table_trigger_helper.table_rowtype := NULL;
r_new table_trigger_helper.table_rowtype := NULL;
i pls_integer;
begin
if update or deleting then
r_old.column_one := :old.column_one
...
end if;
if update or inserting then
r_new.column_one := :new.column_one
end if;
table_trigger_helper.v_old.extend();
table_trigger_helper.v_new.extend();
i := table_trigger_helper.v_old.last;
table_trigger_helper.v_old( i ) := r_old;
table_trigger_helper.v_new( i ) := r_new;
end row_level_trigger_name;
/
Триггер уровня оператора:
create or replace trigger statement_level_trigger_name
after insert or delete or update
on table_name
declare
begin
--process through your new and old records;
--table_trigger_helper.v_old
--table_trigger_helper.v_new
end statement_level_trigger_name;
/