我有一个包含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;
/
但插入后我收到错误。
答案 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