Оператор update продолжает обновлять все строки:(, задействовано отношение "ИЛИ"?
Пожалуйста, проверьте, почему этот код продолжает обновлять все строки в таблице
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),
код прекрасно работал между первыми тремя условиями, пока я не осознал, что слишком много сделал "ИЛИ" отношений.
Любое предложение, как я могу исправить этот код, чтобы выполнить все условия, которые я сделал?:)
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
предложить формат, который вы ожидаете...)