update 语句不断更新所有行 :( , 'OR' 涉及的关系?
update statement keeps updating all rows :( , 'OR' relation involved?
请检查为什么此代码不断更新 table
中的所有行
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),
代码在前三个条件之间完美运行,直到我意识到我对 "OR" 关系做了太多。
有什么建议可以修改此代码以满足我提出的所有条件吗? :)
AND is evaluated before 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
的列(并且它 应该 是一个日期或者可能是一个时间戳,not a string), ORDER_DATE = '&TIME_1'
确实应该有一个显式的 TO_DATE()
调用,其格式掩码与您希望用户输入它的方式相匹配,例如ORDER_DATE = TO_DATE('&TIME_1', 'MM-DD-YYYY HH24:MI:SS')
。目前,您依赖于使用当前会话的 NLS 设置的任何隐式转换,这可能对您有用,但对其他人可能不起作用 运行 脚本。
(另请参阅 ACCEPT
以提示输入您期望的格式...)
请检查为什么此代码不断更新 table
中的所有行 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),
代码在前三个条件之间完美运行,直到我意识到我对 "OR" 关系做了太多。
有什么建议可以修改此代码以满足我提出的所有条件吗? :)
AND is evaluated before 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
的列(并且它 应该 是一个日期或者可能是一个时间戳,not a string), ORDER_DATE = '&TIME_1'
确实应该有一个显式的 TO_DATE()
调用,其格式掩码与您希望用户输入它的方式相匹配,例如ORDER_DATE = TO_DATE('&TIME_1', 'MM-DD-YYYY HH24:MI:SS')
。目前,您依赖于使用当前会话的 NLS 设置的任何隐式转换,这可能对您有用,但对其他人可能不起作用 运行 脚本。
(另请参阅 ACCEPT
以提示输入您期望的格式...)