在Oracle触发器的同一表中插入后如何更新?

new*_*bie 1 oracle triggers

我有一个包含X,Y和Z列的表。我想在插入或更新X和Y时设置Z,所以Z = X * Y,使用触发器。

create or replace trigger tr_tab
after insert
on tab
for each row
begin
update tab
set z=x*y;
end;
/
Run Code Online (Sandbox Code Playgroud)

但是插入后出现错误。

Ale*_*ole 5

您不会(而且通常也不会)更新您要插入的行;您需要通过为当前行设置新的Z值来更改要插入的内容:

create or replace trigger tr_tab
before insert or update
on tab
for each row
begin
  :new.z := :new.x * :new.y;
end;
/
Run Code Online (Sandbox Code Playgroud)

这是指使用插入/更新的行:newpseudorecord语法

这需要是插入前触发器才能操作:new列的值;插入后的每行触发器触发到很晚才能进行更改。

您可能有一个插入后语句级触发器-即您在问题中显示的内容,但是for each row删除了该行-但这将更新表中每一行的Z,即使没有任何变化,也将做更多的工作并产生不必要的重做。(在文档中阅读有关触发器类型的更多信息)。

您还可以选择使Z 成为虚拟列该虚拟列是根据其他列的值自动生成的,而无需触发。