0

请检查为什么此代码不断更新表中的所有行

    UPDATE FINANCE_ORDERS                                                              
    SET ORDER_STATUS = 'NOT APPROVED EWW'
    WHERE
    ORDER_DATE = '&TIME_1'
    AND
    ((&V5)*(&V6)) < (&V7) 
    OR 
    ((&V5)*(&V6)) - (&V7) < (&V3) 
    OR 
    (&V3) < (&V8) 
    OR
    (&V3) > (&V9)
    /

SQL> /
Enter value for time_1: 12-14-2018 05:53:43
old   4: ORDER_DATE = '&TIME_1'
new   4: ORDER_DATE = '12-14-2018 05:53:43'
Enter value for v5: 15
Enter value for v6: 15000
Enter value for v7: 175000
old   6: ((&V5)*(&V6)) < (&V7)
new   6: ((15)*(15000)) < (175000)
Enter value for v5: 15
Enter value for v6: 15000
Enter value for v7: 175000
Enter value for v3: 1500
old   8: ((&V5)*(&V6)) - (&V7) < (&V3)
new   8: ((15)*(15000)) - (175000) < (1500)
Enter value for v3: 1500
Enter value for v8: 2000
old  10: (&V3) < (&V8)
new  10: (1500) < (2000)
Enter value for v3: 1500
Enter value for v9: 180000
old  12: (&V3) > (&V9)
new  12: (1500) > (180000)

3 rows updated.

上面的代码应该只为那些具有相同日期和时间 (varchar2) 的行更新订单状态,例如 (12-14-2018 05:53:43),

代码在前三个条件之间运行良好,直到我意识到我做了太多的“或”关系。

任何建议我如何修复此代码以满足我所做的所有条件?:)

4

1 回答 1

1

AND 在 OR 之前被评估,所以你有隐含的额外括号;有效:

UPDATE FINANCE_ORDERS                                                              
SET ORDER_STATUS = 'NOT APPROVED EWW'
WHERE
(
   ORDER_DATE = '&TIME_1'
   AND
   ((&V5)*(&V6)) < (&V7) 
)
OR 
((&V5)*(&V6)) - (&V7) < (&V3) 
OR 
(&V3) < (&V8) 
OR
(&V3) > (&V9)
/

如果您自己添加额外的括号,您可以控制顺序或评估:

UPDATE FINANCE_ORDERS                                                              
SET ORDER_STATUS = 'NOT APPROVED EWW'
WHERE
ORDER_DATE = '&TIME_1'
AND
(
  ((&V5)*(&V6)) < (&V7) 
  OR 
  ((&V5)*(&V6)) - (&V7) < (&V3) 
  OR 
  (&V3) < (&V8) 
  OR
  (&V3) > (&V9)
)
/

顺便说一句,假设这ORDER_DATE是一个具有数据类型的列DATE(它应该是一个日期或可能是一个时间戳,而不是一个字符串),它ORDER_DATE = '&TIME_1'应该确实有一个显式TO_DATE()调用,其格式掩码与您期望用户输入它的方式相匹配,例如ORDER_DATE = TO_DATE('&TIME_1', 'MM-DD-YYYY HH24:MI:SS'). 目前,您依赖于使用当前会话的 NLS 设置发生的任何隐式转换,这可能对您有用,但可能不适用于运行脚本的其他人。

(另请参阅ACCEPT提示您期望的格式...)

于 2018-12-14T16:41:13.880 回答