Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Oracle的触发器中,如何从更新中的“where”中获取信息?_Sql_Oracle_Triggers - Fatal编程技术网

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

Sql 在Oracle的触发器中,如何从更新中的“where”中获取信息?,sql,oracle,triggers,Sql,Oracle,Triggers,假设我们有一个简单的表: ID | Name 1 | "A" 2 | "B" 更新可以是 update set Name = "C" where ID = 1 因此,在创建触发器时,我知道如何通过:new.获取新行的信息,但ID不会像我尝试的那样出现在那里 如何从新更新的行中获取ID信息?只需将其称为“:OLD.column name” 在行级更新触发器中,:OLD表示应用更新之前列中的现有值 就你而言,你可以这样做- old_id := :old.ROWID 你到底试了什么?以下

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

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”触发器范围内的批处理操作,您将把它从一个集合操作转变为一个逐行操作,因此您将看到性能下降。我也会质疑你用触发器做什么;根据我的经验,你可以做大多数事情,而不需要使用触发器

您也可以参考
:new.id
;行中的所有列都可用,而不仅仅是那些已修改的列。由于ID不会改变(希望如此),您可以在更新触发器中使用
:old
:new
,并获得相同的值。因此,也许您应该显示您拥有的未编译的实际代码,以及实际的表定义、实际的update语句和错误?