ORACLE:一次更新多个列

Dav*_*cia 8 sql 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%');
Run Code Online (Sandbox Code Playgroud)

问题是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
Run Code Online (Sandbox Code Playgroud)

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

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

103计算罚款,即10%的折扣

APC*_*APC 23

完全可以在同一语句中更新多个列,实际上您的代码正在执行它.那么为什么看起来"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;
Run Code Online (Sandbox Code Playgroud)

也许这对你来说似乎有点笨拙.它是,但问题在于您的数据模型.在表中存储可派生值而不是在需要时派生,很少会产生优雅的SQL.