Оператор update продолжает обновлять все строки :(, задействовано отношение «ИЛИ»? - PullRequest
0 голосов
/ 14 декабря 2018

Пожалуйста, проверьте, почему этот код продолжает обновлять все строки в таблице

    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 Ответ

0 голосов
/ 14 декабря 2018

И вычисляется до ИЛИ , поэтому у вас есть неявные дополнительные скобки;эффективно:

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 для запроса ожидаемого формата ...)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...