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

时间:2015-06-22 10:08:05

标签: 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;
/

但插入后我收到错误。

2 个答案:

答案 0 :(得分:4)

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

Eg:
adapter.setListItems(avisosList); 
adapter.notifyDataSetChanged(); 

这是指使用the :new pseudorecord syntax插入/更新的行。

这需要是一个插入前触发器来操纵列的create or replace trigger tr_tab before insert or update on tab for each row begin :new.z := :new.x * :new.y; end; / 值;后插入每行触发器会触发,以便进行更改。

你可以有一个后插入语句级别触发器 - 即你在问题中显示但删除了:new行的内容 - 但即使没有任何改变,也会为表中的每一行更新Z,更多的工作和产生不必要的重做。 (阅读有关触发类型in the documentation)的更多信息。

您还可以选择使用其他列的值自动生成Z a virtual column,而无需触发器。

答案 1 :(得分:0)

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

update tab
set :new.z=:new.x*:new.y;

如果您想区分插入和更新,可以这样做:

if (inserting or updating) then
        //Do things
end if;

创建触发器所需的所有信息都在此页面中: http://docs.oracle.com/cd/B14117_01/appdev.101/b10795/adfns_tr.htm