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

In a trigger in Oracle, how to get the information out of the `where` from an update?

假设我们有一个简单的 table:

ID | Name

1  | "A"

2  | "B"

更新可以

update set Name = "C" where ID = 1

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

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

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

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

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

old_id := :old.ROWID

您具体尝试了什么?以下对我有用:

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-row-trigger 的范围所涵盖的问题 table 上进行批处理操作,您将把它从一个集合将操作转换为逐行操作,因此您会看到性能下降。我还会质疑您使用触发器做什么?根据我的经验,您无需借助触发器即可完成大部分操作!