Oracle事务更新量从一个表到另一个表

时间:2017-04-13 14:51:37

标签: sql database oracle

我正在创建一个包含四个不同表的数据库:

CUSTOMER

我需要创建一个1)的事务。将数据插入新的INVOICE,2)。将数据插入新的INVOICE_ITEM(发票金额设置为0),3)。插入两个新INVOICE_ITEM_QUANTITY的数据(一行INVOICE_ITEM_PRICE设置为2,INVOICE_AMOUNT设置为5.00,另一行设置为1和10.00。

我可以使用insert命令完成所有这些操作,但下一步是让我失望:

'更新INVOICE_AMOUNT,将步骤3中添加的订单项添加到INVOICE_ITEM_PRICE字段。您必须使用一个查询来执行此操作,无论此INVOICE是否存在INVOICE_ITEM行。您的查询无法对金额进行硬编码。'

我无法弄清楚我将如何做到这一点。我一直在研究解决方案,但没有找到任何描述这个问题的东西,只有在列名相同时才有效。

我可以直接将值插入UPDATE INVOICE,但是它会被认为是难以编码的答案,对吗?所以我一直在努力做一些事情
SET INVOICE_ITEM.INVOICE_ITEM_PRICE = INVOICE.INVOICE_AMOUNT
WHERE INVOICE.INVOICE_ID = INVOICE_ITEM.INVOICE_ID
{{1}}

但我无法使用此代码的任何变体。我确信有一些非常简单的答案会让我感到愚蠢,但如果有人能提供帮助,我会非常感激。

2 个答案:

答案 0 :(得分:0)

这可能有点笨拙,但考虑到你所拥有的,并没有表明当时使用PL / SQL;

UPDATE invoice i
SET    i.invoice_amount = (SELECT SUM(ii.invoice_item_quantity * ii.invoice_item_price)
                           FROM   invoice_item ii
                           WHERE  ii.fk_invoice_id = 1.invoice_id)
WHERE  i.invoice_id = (SELECT MAX(invoice_id)
                       FROM   invoice
                       WHERE  fk_cust_id = (SELECT MAX(cust_id)
                                            FROM   customer) )

所以。 。 。将发票金额设置为发票的发票项目的数量*价格总和。只需更新具有最新发票ID且最新发票适用于最新客户的发票记录。 这假设您使用序列创建PK值(发票应该采用最新的发票号并向其添加1)。其他可能是简单的Oracle序列。                                             抱歉笨拙,但这是一个虚拟的星期五,我即将回家。

答案 1 :(得分:0)

你可以制作一个更新invoice_ammount的触发器。像这样:

CREATE OR REPLACE TRIGGER tg_invoice_item_amt 
  AFTER 
    DELETE OR 
    INSERT OR 
    UPDATE OF invoice_item_quantity, invoice_item_price
  ON invoice_item
  FOR EACH ROW
DECLARE
  l_change_amt NUMBER;
BEGIN
  CASE
    WHEN INSERTING THEN
      l_change_amt := COALESCE(:NEW.invoice_item_quantity * :NEW.invoice_item_price, 0);
    WHEN UPDATING THEN
      l_change_amt := COALESCE(:NEW.invoice_item_quantity * :NEW.invoice_item_price, 0) 
                      - COALESCE(:OLD.invoice_item_quantity * :OLD.invoice_item_price, 0);
    WHEN DELETING THEN
      l_change_amt := 0 - COALESCE(:OLD.invoice_item_quantity * :OLD.invoice_item_price, 0);
  END CASE;
  IF l_change_amt != 0 THEN
    UPDATE invoice SET invoice_amount = invoice_amount + l_change_amt;
END;
/