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

在Oracle触发器的同一个表中插入后如何更新?,oracle,triggers,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; / 但是在插入之后,我得到了一个错误 必须引用新插入的值才能执行此操作 update tab set :new.z=:new.x*:new.y; 如果您想区分插入和更新,可以这样做: if (insertin

我有一个包含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;
/

但是在插入之后,我得到了一个错误

必须引用新插入的值才能执行此操作

update tab
set :new.z=:new.x*:new.y;
如果您想区分插入和更新,可以这样做:

if (inserting or updating) then
        //Do things
end if;
创建触发器所需的所有信息都在此页面中:

必须引用新插入的值才能执行此操作

update tab
set :new.z=:new.x*:new.y;
如果您想区分插入和更新,可以这样做:

if (inserting or updating) then
        //Do things
end if;
创建触发器所需的所有信息都在此页面中:

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

create or replace trigger tr_tab
before insert or update
on tab
for each row
begin
  :new.z := :new.x * :new.y;
end;
/
这是指使用插入/更新的行

这需要是一个插入前触发器来操作列的
:new
值;每行的after insert触发器触发到late以进行更改

您可以有一个后insert语句级触发器,即您在问题中显示的,但删除了每行的
行,但这将更新表中每行的Z,即使没有任何更改,也会做更多的工作并生成不必要的重做。(请阅读有关触发器类型的更多信息)

您还可以选择根据其他列的值自动生成Z,而无需触发器。

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

create or replace trigger tr_tab
after insert
on tab
for each row
begin
update tab
set z=x*y;
end;
/
create or replace trigger tr_tab
before insert or update
on tab
for each row
begin
  :new.z := :new.x * :new.y;
end;
/
这是指使用插入/更新的行

这需要是一个插入前触发器来操作列的
:new
值;每行的after insert触发器触发到late以进行更改

您可以有一个后insert语句级触发器,即您在问题中显示的,但删除了每行的
行,但这将更新表中每行的Z,即使没有任何更改,也会做更多的工作并生成不必要的重做。(请阅读有关触发器类型的更多信息)


您还可以选择根据其他列的值自动生成Z,而不需要触发器。

插入后我得到一个错误“正在变异,触发器/函数可能看不到它”插入后我得到一个错误“正在变异,触发器/函数可能看不到它”我得到这个错误。PLS-00103:遇到符号“=”应为以下情况之一时::=。(@%;指示符“:=”已插入“=”之前以继续。@新手-是,抱歉,键入错误;PL/SQL赋值应为
:=
。现已修复。我收到此错误。无法更改此触发器的新值type@newbie-正确;我应该多加注意。你需要一个插入前触发器。(或插入后的原始数据,但在表格级别,没有每行的
-但这将重新计算所有行的值,这是不必要的)我收到此错误。PLS-00103:在预期以下情况之一时遇到符号“=”:=。(@%;指示符号“:=”在“=”之前插入若要继续。@新手-是,抱歉,输入错误;PL/SQL赋值应为
:=
。已修复。现在。我收到此错误。无法更改此触发器的新值type@newbie-正确;我应该多加注意。你需要一个插入前触发器。(或者在insert之后,在表格级别,每行没有
-但这会重新计算所有行的值,这是不必要的)@newbie-说明您得到的错误很有帮助-这里可能是一个变异表错误。@newbie-说明您得到的错误很有帮助-这里可能是一个变异表错误。
create or replace trigger tr_tab
after insert
on tab
for each row
begin
update tab
set z=x*y;
end;
/