在Oracle的触发器中,如何从更新中的`where`中获取信息?

时间:2015-01-23 10:53:17

标签: sql oracle triggers

假设我们有一个简单的表格:

ID | Name

1  | "A"

2  | "B"

更新可以

update set Name = "C" where ID = 1

因此,在创建触发器时,我知道如何通过:NEW.获取新行的信息,但在我尝试时ID不会出现在那里。

如何从新更新的行中获取ID信息?

2 个答案:

答案 0 :(得分:0)

只需将其称为":OLD.column-name"

在行级UPDATE触发器中,:OLD表示在应用更新之前列中的现有值。

在你的情况下,你可以做 -

old_id := :old.ROWID

答案 1 :(得分:0)

你究竟尝试了什么?以下适用于我:

set serveroutput on;

drop table test;

create table test (id number, name varchar2(10));

insert into test values (1, 'A');
insert into test values (2, 'B');
commit;

create or replace trigger test_trg
before update on test
for each row
begin
  dbms_output.put_line('id of row being updated is: '||:old.id||' and it''s new value is: '||:new.id);
end;
/

update test
set name = 'C'
where id = 1;

commit;

我得到的输出是:

Table dropped.
Table created.
1 row created.
1 row created.
Commit complete.
Trigger created.
id of row being updated is: 1 and it's new value is: 1
1 row updated.
Commit complete.

请记住,如果您对for-each-trigger-trigger范围所涉及的表进行批处理操作,那么您将把它从set操作转换为row-by - 运行,所以你会看到性能降级。我也会质疑你用触发器做什么;根据我的经验,你可以做大部分事情,而不需要诉诸触发器!