有人可以解释一下是什么意思:
:new
并:old
在触发代码中。
: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'
用简单的英语:
它们是别名,允许您从列的状态(旧)和它将如何(新)访问信息。
旧值和新值在 BEFORE 和 AFTER 行触发器中都可用。可以在 BEFORE 行触发器中分配新的列值,但不能在 AFTER 行触发器中分配(因为触发语句在触发 AFTER 行触发器之前生效)。如果 BEFORE 行触发器更改了 new.column 的值,那么由同一语句触发的 AFTER 行触发器会看到 BEFORE 行触发器分配的更改。
相关名称也可以用在 WHEN 子句的布尔表达式中。在触发器主体中使用旧限定符和新限定符时,冒号必须位于它们之前,但在 WHEN 子句或 REFERENCING 选项中使用限定符时不允许使用冒号。
在触发器中,:old
记录包含触发语句执行之前的值,:new
记录包含执行之后的值。
old
值是值,值是before the change
,例如,在 a 上,10 是值,列中的当前值是旧的。new
value to be changed
update set col1=10
new
在插入时,没有旧值,只有新值;在删除时,没有新值,只有旧值