2017-04-13 87 views
0

我創建一個包含四個不同表的數據庫:Oracle事務更新量從一個表到另一個

CUSTOMER (PK CUST_ID, CUST_NAME, CUST_ADDRESS) 

INVOICE (PK INVOICE_ID, FK CUST_ID, INVOICE_AMOUNT) 

PRODUCT (PK PRODUCT_ID, PRODUCT_NAME, PRODUCT_COST) 

INVOICE_ITEM (PK FK INVOICE_ID, PK FK PRODUCT_ID, 
INVOICE_ITEM_QUANTITY, INVOICE_ITEM_PRICE) 

我需要建立一個交易:1)。將數據插入新的CUSTOMER,2)。將數據插入新的INVOICE(發票金額設爲0),3)。插入兩個新的INVOICE_ITEM的數據(一行有INVOICE_ITEM_QUANTITY設爲2,INVOICE_ITEM_PRICE爲5.00,另一行爲1和10.00)。

我能做到這一切,而不使用INSERT命令的任何問題,但下一步是絆倒了我,讓

「更新INVOICE_AMOUNT添加在步驟3到INVOICE_ITEM_PRICE場添加的行項目。您必須使用可以工作的查詢來執行此操作,而不管此INVOICE中是否存在INVOICE_ITEM行。您的查詢無法硬編碼金額。'

我無法弄清楚我會如何去做這件事。我一直在研究解決方案,但沒有發現任何描述這個問題的東西,只有那些在列名相同的情況下才有效。

我可以直接將值插入到INVOICE_AMOUNT,但這會被認爲是硬編碼的答案,對嗎?所以我一直試圖做一些沿線的

UPDATE INVOICE
SET INVOICE_ITEM.INVOICE_ITEM_PRICE = INVOICE.INVOICE_AMOUNT
WHERE INVOICE.INVOICE_ID = INVOICE_ITEM.INVOICE_ID

但我不能得到這個代碼的任何變化工作。我確信有一些非常簡單的答案,會讓我感到很蠢,但如果有人能夠幫助,我會非常感激。

+0

對我來說,INVOICE_AMOUNT應該是'總和(invoice_Item.Invoice_Item_Price * Invoice_Item_Quantity)'所以你需要獲得和確保它不是空(或者其無效,至少使其0) – xQbert

+0

我也知道這一點,但在我的任務中注意到:您是否應該有一個INVOICE_AMOUNT字段值得懷疑,因爲您始終可以查詢INVOICE_ITEM表併爲每個發票項目總結INVOICE_ITEM_QTY * INVOICE_ITEM_PRICE。但是,對於這項任務,我們假設我們想要這樣做。 – CBevs

+0

相似問題:http://stackoverflow.com/questions/2446764/update-statement-with-inner-join-on-oracle – xQbert

回答

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)) 

所以。 。 。將發票金額設置爲發票發票項目的數量*價格之和。只需更新具有最新發票編號的發票記錄,並且該最新發票是針對最新客戶的。 這假設您使用序列創建PK值(發票應該取最新的發票號碼並將其加1)。其他可能是簡單的Oracle序列。 對不起,但它是一個虛擬的星期五在這裏,我即將回家。

+0

你是男人中的傳奇人物。感謝您在虛擬的星期五給我你的時間! – CBevs

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; 
/
相關問題