14

我正在尝试使用相同的更新语句更新两列可以完成吗?

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_discount 的值

INV_TOTAL = sub_total - 折扣

    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

108假设是 25 的 20%,折扣金额正确但 inv_total 不正确,应该是 $20,而不是 $22.50

109假设是 50 的 30% 折扣金额是正确的,但 inv_total 应该是 $35

103计算罚款,即10%折扣

4

2 回答 2

34

在同一个语句中更新多个列是完全可能的,实际上您的代码正在这样做。那么为什么看起来“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;

        

Perhaps that seems a bit clunky to you. It is, but the problem lies in your data model. Storing derivable values in the table, rather than deriving when needed, rarely leads to elegant SQL.

于 2012-11-24T10:11:45.863 回答
1

我想这里的问题是您正在更新 INV_DISCOUNT 并且 INV_TOTAL 使用 INV_DISCOUNT。这就是这里的问题。您可以使用更新语句的返回子句来使用新的 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;
于 2012-11-24T08:08:07.677 回答