14

同じ update ステートメントを使用して 2 つの列を更新しようとしていますが、それは可能ですか?

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_discountINV_TOTALのみが更新されていないことです。

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 は正しくありません。22.50 ドルではなく 20 ドルである必要があります。

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;

        

おそらく、それは少し不格好に思えるでしょう。それはそうですが、問題はデータ モデルにあります。必要なときに導出するのではなく、導出可能な値をテーブルに格納しても、洗練された SQL につながることはめったにありません。

于 2012-11-24T10:11:45.863 に答える
1

ここでの問題は、INV_DISCOUNT を更新していて、INV_TOTAL が INV_DISCOUNT を使用していることだと思います。それがここでの問題です。update ステートメントの return 句を使用して、新しい 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 に答える