我有一个包含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)
但是插入后出现错误。
您不会(而且通常也不会)更新您要插入的行;您需要通过为当前行设置新的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 成为虚拟列,该虚拟列是根据其他列的值自动生成的,而无需触发。
| 归档时间: |
|
| 查看次数: |
23760 次 |
| 最近记录: |