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