【问题标题】:Trigger has mutating error when insert插入时触发器有变异错误
【发布时间】:2014-11-29 00:52:11
【问题描述】:

我的触发器有问题。将触发器添加到数据库后,当我尝试插入触发器将作用的行时,出现变异表错误。我不知道如何避免这种情况。有人介意看看这个并告诉我我做错了什么,以及如何重写它?

CREATE OR REPLACE TRIGGER ORNG_INV_LINE_TOTAL_TRIGGER
FOR INSERT OR UPDATE ON ORNG_INV_LINE
COMPOUND TRIGGER 
AFTER EACH ROW IS
BEGIN 
UPDATE ORNG_INVOICE SET Inv_Amount = (SELECT SUM(ORNG_INV_LINE.Inv_Line_Total) 
FROM ORNG_INV_LINE
WHERE ORNG_INVOICE.INV_Num = :NEW.INV_Num);
END AFTER EACH ROW;
END ORNG_INV_LINE_TOTAL_TRIGGER;
/

我不确定它为什么会触发错误。我正在尝试在更新后执行此操作。我要做的就是获取所有匹配发票编号的所有行的总和,并将该值写入 INVOICE 表中。感谢您的帮助。

【问题讨论】:

    标签: sql triggers oracle11g


    【解决方案1】:

    您的触发器被写入表 ORNG_INV_LINE 以进行插入或更新,并且您在更新 ORNG_INVOICE 表时再次在同一个表上进行了选择,因此触发器正在发生变化, 要克服这一点,您必须使用语句级触发器而不是行级触发器。 即在每个语句之后应该在代码中而不是在每一行之后。 这可以帮助你。

    【讨论】:

    • 抱歉下面的帖子,我发布答案时没有看到这个。使用语句级触发器是正确的,如下所示。感谢您的关注……不幸的是,我仍然没有掌握这个废话的窍门。
    【解决方案2】:

    这是解决方案...显然每个人都忙于感恩节。希望这可以帮助下一个人。

    create or replace TRIGGER ORNG_INV_L_TTL_TRIG
    AFTER INSERT OR UPDATE OR DELETE ON ORNG_INV_LINE
    BEGIN
    UPDATE ORNG_INVOICE SET Inv_Amount = (SELECT SUM(Inv_Line_Total) 
    FROM ORNG_INV_LINE
    WHERE INV_Num = ORNG_INVOICE.INV_Num);
    END ORNG_INV_L_TTL_TRIG;
    /
    

    【讨论】:

      猜你喜欢
      • 2016-06-17
      • 2019-09-15
      • 2015-02-05
      • 1970-01-01
      • 2013-07-17
      • 1970-01-01
      • 2018-02-19
      • 1970-01-01
      • 2019-01-02
      相关资源
      最近更新 更多