[英]triggers in new and old columns
为什么我们不能在语句级触发器中使用:new和:old列?
因为可能是语句插入/删除/更新多于一行的情况。 因此,没有新列或旧列。
例:
update FOO set a = 12 where b = 9;
要么:
delete from FOO where b = 9;
要么:
insert into FOO (a, b) select 12, x from BAR;
如果FOO表具有语句触发器,则在这三个句子中无法判断您是对单行,单行还是多行进行操作。
因为DML可能是基于集合的,所以会影响表中的多行。 实际上,由于SQL是基于集合的,因此通常是这种情况。 因此,语句级触发器无法确定您所指的:OLD和哪个:NEW值。
如前所述,语句级触发器可以用于多行更改,因此: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;
/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.