Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ORACLE:一次更新多个列_Sql_Oracle - Fatal编程技术网

Sql ORACLE:一次更新多个列

Sql ORACLE:一次更新多个列,sql,oracle,Sql,Oracle,我正在尝试使用相同的update语句更新两列,可以吗 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

我正在尝试使用相同的update语句更新两列,可以吗

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\u TOTAL
没有更新,只有INV\u折扣

DISC3=0.3即30%的折扣,因此,无论小计是多少,都将乘以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
108假设为25的20%,折扣金额是正确的,但投资总额不是,应该是20美元,而不是22.50美元

109假设为50的30%。折扣金额是正确的,但投资总额应为35美元


103计算罚款,即10%折扣

我猜这里的问题是您正在更新库存折扣,库存总额使用库存折扣。这就是问题所在。 您可以使用update语句的returning子句来使用新的库存折扣,并使用它来更新库存总额

这是一个通用的例子,请告诉我这是否解释了我提到的要点

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;

完全有可能在同一条语句中更新多个列,事实上,您的代码正在这样做。那么为什么看起来“库存总额没有更新,只有库存折扣”

因为您正在使用库存折扣更新库存总额,数据库将使用库存折扣的现有值,而不是您将其更改为的值。所以我想你需要做的是:

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

        

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

Lol,这就浪费了10个小时,我的过程计算投资总额的唯一方法是执行该过程两次。还有一些问题,似乎计算错了:S