SQL触发器正确编译但抛出错误

时间:2016-06-15 12:16:00

标签: oracle oracle-sqldeveloper

我正在尝试创建一个触发器,在添加新行时将值从一列(“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代码的解决方案,但我无法弄清楚它为什么不起作用。

感谢。

2 个答案:

答案 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语句触发器使用更新原始表   来自临时表的值。