2012-02-27 35 views
3

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

顺便说一下,我使用Oracle和PL/SQL。

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

回答

4

无法更新您的触发射击对阵表,你会得到一个ORA-04091变异表错误。只要它是'before'触发器,您就可以使用:NEW语法更新行本身的值。

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

如果你是连续更新那么你可以通过设置例如:NEW.subtotal := :OLD.subtotal - :OLD.value + :NEW.value来调整一个字段,但不知道该字段的好处是什么。

这将有助于了解你的业务逻辑以及它是如何与插入/更新,并且要触发做什么结合使用。通常对于这样的事情,你真的想在插入/更新时使用包装程序,而不是触发器,但目前它有点模糊。

的小计,以保持准确,我可能会避免试图保持这一切,而是使用具有解析函数计算它为您的视图。根据我的经验,更少麻烦。

+0

我更新了我原来的帖子。 – 2012-02-27 15:28:30

+0

@ user1231958 - 我一定会看看存储过程来做到这一点。可能在提交之前进行更新,以避免同时发生更新的风险。 – 2012-02-27 15:31:29

+0

如果由于某种原因某人遇到了SQL * Plus控制台或类似的东西,并以错误的方式插入/更新数据会导致所有事情都搞乱,该怎么办? – 2012-02-27 15:34:05

1

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

+0

如果我正在使用'插入每行之后'怎么办? – 2012-02-27 15:16:20

+0

这就是INSERT完成后 - 您插入后不能更改行, – 2012-02-27 15:23:52

+0

我使用业务规则更新了帖子。 – 2012-02-27 15:28:48