在触发期间更新oracle中的同一行?

时间:2012-02-27 15:08:48

标签: database oracle plsql

简短的问题,因为我不知道如何搜索这个。我可以“重新更新”同一行吗?例如,我有一个存储付款小计的字段,考虑到我的业务限制,我可以更新该值。我可以只用触发器来更新同一行的总数吗?先谢谢你了!

顺便说一句,我正在使用Oracle和PL / SQL。

业务规则:我有以下内容。有一个表可以存储将支付数据,另一个表存储要支付的月费,另一个表存储可能的折扣。一个人付费只能打折一次,并且会支付商店的小计和总额。所以,我正在做的是......“当贴现信息被更新时,在提交后,更新总价值和费用的价值”。

2 个答案:

答案 0 :(得分:4)

您无法更新触发器触发的表,您将收到ORA-04091变异表错误。您可以使用:NEW语法更新行本身的值,只要它是'之前'触发器。

我不清楚你对小计的意思;听起来你在桌子上有一个正在运行的总场;如果那是基于同一个表上的其他记录(例如,您有相同订单的多个记录,并且您希望插入的记录具有所有先前记录的总和)。如果是这种情况那么你也不能这样做,因为你打了同样的ORA-04901。

如果您正在更新行,则可以通过设置:NEW.subtotal := :OLD.subtotal - :OLD.value + :NEW.value来调整字段,但不确定该字段的好处是什么。

了解您的业务逻辑是什么以及它如何适应插入/更新以及您希望触发器执行什么将会很有帮助。通常使用这样的东西你真的想在插入/更新周围使用包装程序,而不是触发器,但目前它有点模糊。

为了使小计保持准确,我可能会避免尝试维护它,而是使用具有分析函数的视图为您计算它。根据我的经验,麻烦少得多。

答案 1 :(得分:1)

是 - BEFORE INSERT for each row触发器可以修改插入的值。