2012-11-24 65 views
3

我想使用相同的更新語句來更新兩列嗎?ORACLE:立即更新多個列

IF V_COUNT = 9 THEN 
     UPDATE INVOICE 
     SET INV_DISCOUNT = DISC3 * INV_SUBTOTAL 
       , INV_TOTAL = INV_SUBTOTAL - INV_DISCOUNT  
     WHERE INV_ID = I_INV_ID; 
     DBMS_OUTPUT.PUT_LINE ('YOU QUALIFY FOR A DISCOUNT OF 30%'); 

的問題是,INV_TOTAL沒有更新,只有inv_discount

DISC3 = 0.3 IE 30%的折扣,所以什麼都SUB_TOTAL是將0.3相乘,這就是折扣

INV_ID|INV_DATETIME     |INV_SUBTOTAL|INV_DISCOUNT| INV_TOTAL 
----------|------------------------------|------------|------------|----------- 
     100|14-NOV-12 09.40.06.918000  |  $.00|  $.00|  $.00 
     101|18-MAR-12 10.03.00.000000  |  $.00|  $.00|  $.00 
     102|18-MAR-12 10.15.00.000000  |  $.00|  $.00|  $.00 
     103|18-MAR-12 10.55.00.000000  |  $80.00|  $8.00|  $72.00 
     104|18-MAR-12 10.38.00.000000  |  $.00|  $.00|  $.00 
     105|12-JUN-12 15.15.00.000000  |  $.00|  $.00|  $.00 
     106|06-AUG-12 12.13.00.000000  |  $.00|  $.00|  $.00 
     107|04-MAY-12 09.15.00.000000  |  $.00|  $.00|  $.00 
     108|29-NOV-12 13.16.00.000000  |  $25.00|  $5.00|  $22.50 
     109|18-MAR-12 10.37.00.000000  |  $50.00|  $15.00|  $45.00 
- 用於INV_discount

INV_TOTAL = SUB_TOTAL值

被假設是25 20%,折扣金額是正確的,但inv_total不是,它應該是20 $,而不是$ 22.50

被假設是50折扣金額30%是正確的,但inv_total應該是$ 35

計算罰款,這是10%的折扣

回答

14

這是完全有可能在同一個語句更新多個列的點,而事實上你的代碼是做什麼的。那麼爲什麼看起來「INV_TOTAL沒有更新,只有inv_discount」呢?

由於您正在使用INV_DISCOUNT更新INV_TOTAL,並且數據庫將使用INV_DISCOUNT的現有值現有值而不是您更改它的值。所以恐怕你需要做的是這樣的:

UPDATE INVOICE 
    SET INV_DISCOUNT = DISC1 * INV_SUBTOTAL 
      , INV_TOTAL = INV_SUBTOTAL - (DISC1 * INV_SUBTOTAL)  
WHERE INV_ID = I_INV_ID; 

也許這對你來說有點笨拙。它是,但問題在於你的數據模型。在表中存儲可導出的值,而不是在需要時派生,很少導致優雅的SQL。

+0

大聲笑,這樣浪費了10個小時就這個,我的程序計算inv_total的唯一方法是執行過程兩次。有點奇怪 –

+0

還有一些問題,它似乎是在計算錯誤:S –

+0

非常感謝現在工作 –

1

我想這裏的問題是,你正在更新INV_DISCOUNT和iNV_TOTAL使用INV_DISCOUNT。所以這是這裏的問題。 您可以使用update語句的返回子句來使用新的INV_DISCOUNT並使用它來更新INV_TOTAL。

這是一個普通的例子,讓我知道,如果這說明我提到

CREATE OR REPLACE PROCEDURE SingleRowUpdateReturn 
IS 
    empName VARCHAR2(50); 
    empSalary NUMBER(7,2);  
BEGIN 
    UPDATE emp 
    SET sal = sal + 1000 
    WHERE empno = 7499 
    RETURNING ename, sal 
    INTO empName, empSalary; 

    DBMS_OUTPUT.put_line('Name of Employee: ' || empName); 
    DBMS_OUTPUT.put_line('New Salary: ' || empSalary); 
END; 
+1

你能舉一個例子嗎 –