我遇到触发器问题。将触发器添加到我的数据库后,当我尝试插入触发器将执行的行时,我得到一个变异表错误。我不知道如何避免这种情况。有人会介意看这个并告诉我我做错了什么,以及如何重写它?
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表中写下该值。谢谢你的帮助。
答案 0 :(得分:1)
您的触发器写在ORNG_INV_LINE表上以进行插入或更新,并且在更新ORNG_INVOICE表时再次对同一个表进行了选择,因此触发器发生了变异, 为了克服这个问题,你必须使用语句级触发器而不是行级触发器。 即每个陈述后应该在代码中而不是在每行之后。 这可以帮到你。
答案 1 :(得分:1)
这是解决方案......显然每个人都忙于感恩节。希望这有助于下一个人。
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;
/