我正在尝试使用相同的更新语句更新两列吗?
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 I.E 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%折扣
答案 0 :(得分:17)
完全可以在同一语句中更新多个列,实际上您的代码正在执行它。那么为什么看起来“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。
答案 1 :(得分:1)
我想这里的问题是你正在更新INV_DISCOUNT而INV_TOTAL使用INV_DISCOUNT。这就是问题所在。 您可以使用update语句的returns子句来使用新的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;