我正在尝试创建一个触发器,在添加新行时将值从一列(“notubes”)复制到同一个表的另一列(“notubesleft”)。触发器编译正确但是当我插入一个新行,它会抛出错误。
我的触发器是:
create or replace TRIGGER NOTUBESLEFT_INSERT_TRIGGER
AFTER INSERT ON SAMPLES FOR EACH ROW BEGIN
update samples
set notubesleft = (select notubes from samples where sampleid = :new.sampleid);
END;
当我尝试提交新行时,我收到错误:
保存对表“APEX_WS_PROMETHEUS”的更改时出现一个错误。“SAMPLES”:
第10行:ORA-04091:表APEX_WS_PROMETHEUS.SAMPLES正在变异, 触发器/功能可能看不到它 ORA-06512:在“APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER”,第2行ORA-04088: 执行触发'APEX_WS_PROMETHEUS.NOTUBESLEFT_INSERT_TRIGGER'时出错 ORA-06512:第1行
我问了一个新问题,因为我可以找到关于如何构造触发器的PL / SQL代码的解决方案,但我无法弄清楚它为什么不起作用。
感谢。
答案 0 :(得分:1)
您无法(轻松)查询您使用行级触发器插入的表格。但你根本不应该查询表格,也不应该使用插入后触发器来执行此操作。改为使用before-insert触发器;您可以从:NEW
伪记录中获取和设置值:
CREATE OR REPLACE TRIGGER NOTUBESLEFT_INSERT_TRIGGER
BEFORE INSERT ON SAMPLES FOR EACH ROW
BEGIN
:new.notubesleft := :new.notubes;
END;
答案 1 :(得分:0)
您遇到了变异表问题。有一个限制,你不能查询FOR FOR EACH ROW触发器中变异的表
Trigger Restrictions on Mutating Tables
如果必须更新变异表,则可以绕过这些限制 通过使用临时表,PL / SQL表或包变量。对于 例如,代替单个AFTER行触发器来更新 原始表,导致变异表错误,你可能会使用两个 触发器 - 更新临时表的AFTER行触发器,以及 AFTER语句触发器使用更新原始表 来自临时表的值。