7

有人可以解释一下是什么意思:

:new:old在触发代码中。

4

4 回答 4

34

: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'
于 2012-05-17T16:15:54.850 回答
3

用简单的英语:

它们是别名,允许您从列的状态(旧)和它将如何(新)访问信息。

来自 Oracle 文档:

旧值和新值在 BEFORE 和 AFTER 行触发器中都可用。可以在 BEFORE 行触发器中分配新的列值,但不能在 AFTER 行触发器中分配(因为触发语句在触发 AFTER 行触发器之前生效)。如果 BEFORE 行触发器更改了 new.column 的值,那么由同一语句触发的 AFTER 行触发器会看到 BEFORE 行触发器分配的更改。

相关名称也可以用在 WHEN 子句的布尔表达式中。在触发器主体中使用旧限定符和新限定符时,冒号必须位于它们之前,但在 WHEN 子句或 REFERENCING 选项中使用限定符时不允许使用冒号。

于 2012-05-17T16:19:12.693 回答
2

在触发器中,:old记录包含触发语句执行之前的值,:new记录包含执行之后的值。

于 2012-05-17T16:16:52.670 回答
2

old值是值,值是before the change,例如,在 a 上,10 是值,列中的当前值是旧的。newvalue to be changedupdate set col1=10new

在插入时,没有旧值,只有新值;在删除时,没有新值,只有旧值

于 2012-05-17T16:20:50.233 回答