有人可以解释一下这意味着什么:
触发器代码中的 :new
和:old
。
答案 0 :(得分:26)
:new
和:old
是伪记录,可让您访问特定列的新值和旧值。如果我有桌子
CREATE TABLE foo (
foo_id NUMBER PRIMARY KEY,
bar VARCHAR2(10),
baz VARCHAR2(10)
);
我插入一行
INSERT INTO foo( foo_id, bar, baz )
VALUES( 1, 'Bar 1', 'Baz 1' );
然后在插入触发器之前的行级
:new.foo_id will be 1
:new.bar will be 'Bar 1'
:new.baz will be 'Baz 1'
,而
:old.foo_id will be NULL
:old.bar will be NULL
:old.baz will be NULL
如果您然后更新该行
UPDATE foo
SET baz = 'Baz 2'
WHERE foo_id = 1
然后在更新前的行级触发器
:new.foo_id will be 1
:new.bar will be 'Bar 1'
:new.baz will be 'Baz 2'
,而
:old.foo_id will be 1
:old.bar will be 'Bar 1'
:old.baz will be 'Baz 1'
如果我然后删除行
DELETE FROM foo
WHERE foo_id = 1
然后在删除行级触发器之前,
:new.foo_id will be NULL
:new.bar will be NULL
:new.baz will be NULL
,而
:old.foo_id will be 1
:old.bar will be 'Bar 1'
:old.baz will be 'Baz 2'
答案 1 :(得分:3)
简明英语:
它们是别名,允许您访问列(旧)的方式以及列(新)的信息。
BEFORE和AFTER行触发器中都有旧值和新值。可以在BEFORE行触发器中分配新的列值,但不能在AFTER行触发器中分配(因为触发语句在触发AFTER行触发器之前生效)。如果BEFORE行触发器更改了new.column的值,则同一语句触发的AFTER行触发器将看到由BEFORE行触发器指定的更改。
关联名称也可以在WHEN子句的布尔表达式中使用。当冒号在触发器的主体中使用时,冒号必须位于旧限定符和新限定符之前,但在WHEN子句或REFERENCING选项中使用限定符时不允许使用冒号。
答案 2 :(得分:2)
在触发器中,:old
记录包含触发语句执行前的值,:new
记录包含执行后的值。
答案 3 :(得分:2)
old
值是值before the change
,new
值是value to be changed
,例如,在update set col1=10
上,10是{ {1}}值和列中当前的值是旧的。
在插入时,没有旧值,只有new和删除时没有新值,只有旧