Ошибка выполнения запроса ORACLE

  1. 9 г. назад

    есть запрос

    select
      blablabla
    from
      table1
    where
      table1.disdate <> 0 and
      qwe.todate(table1.disdate) < current_date
    ;
    

    disdate - integer (т.е. может быть 0 или любое число)
    qwe.todate - функция которая не проверяет параметр и даёт ошибку если входной параметр = 0

    раньше на 9-ке проверка шла до первого условия, теперь видимо проверка идет дальше и происходит вызов qwe.todate(0)
    решилось добавкой decode() во второе условие, но имхо это какой-то костыль...
    Сталкивался кто-нибудь с такой хренью?

    Ответы: (4)
  2. А это где оракл стоит. В ТН?

  3. даёт ошибку если входной параметр = 0
    Булево?

    Ответы: (3)
  4. (2) ну обычная ошибка, возникает при вызове to_date("0.0.0", "DD.MM.YYYY") внутри функции qwe.todate

  5. Курильщик теперь видимо проверка идет дальше и происходит вызов qwe.todate(0)

    уверен? проверить надобно

    Ответы: (5)
  6. (4) проверил, зуп даю... в 9-ке не вываливается ошибка, в 11-ке тот же запрос падает с ошибкой в qwe.todate, хотя туда дойти никак не может по идее...

  7. Ну поставь nvl под скобку. Не мучай

    Ответы: (7)
  8. 12.01.2015 15:05:05 отредактировано Курильщик

    (6) сами функции я корректировать не могу, запрос переделан, вопрос с какой стати такая неожиданная попка стряслась...

    Ответы: (10) (11)
  9. очевидно что table1.disdate <> 0 [smile=^_^]

    Ответы: (12)
  10. Чо за ошибка хоть

    Ответы: (13)
  11. (7) подозреваю, что в disdate в какой то записи попал не 0, а неведома зверюшка. Может null

    Ответы: (11)
  12. sda553 (7) подозреваю, что в disdate в какой то записи попал не 0, а неведома зверюшка. Может null

    точно 0 проверено в первую очередь

    Ответы: (16)
  13. (8) как на table1.disdate <> 0 не стрясается, проверено

  14. (9) выполни
    select to_date("0.0.0", "DD.MM.YYYY") from dual
    прочтёшь точную формулировку, это не принципиально.

  15. а если так?

    select
      blablabla
    from
      table1
    where
      1 = 0 and
      qwe.todate(table1.disdate) < current_date
    
  16. проверю...

  17. (11) абсолютно все записи проверил?
    select * from table1
    where not(disdate in (0,1,2,3,4,5,6,7,8,9,10,11,12))

    Ответы: (17)
  18. (16) конечно все

  19. 13.01.2015 09:40:30 отредактировано Курильщик

    проверил такое

    select * from dual where 0=1 and current_date < qwe.todate(0);

    ошибки нет, т.е. в условие current_date < qwe.todate(0) не заходит (правильно)

    select * from dual where 0=1 and current_date < qwe.todate(0);
    

    ошибка есть, т.е. в условие current_date < qwe.todate(0) заходит (правильно)

    остаётся только такая версия: когда выполняется полный запрос его оракл транслирует в такую форму что вызов qwe.todate(0) в условии отбора отрабатывает первым, надо наверное профилировщик ковырять...

    Ответы: (19) (22)
  20. (18) ты привёл два одинаковых запроса с разными результатами, ошибся?

    Ответы: (21)
  21. но, в общем, понятно, моя наживка сработала, и дело вовсе не в изменении алгоритма проверки логических условий, а где-то глубже в данных или сабжевом запросе

  22. 13.01.2015 10:19:21 отредактировано Курильщик

    (19) да второй забыл поправить, извиняюсь

    select * from dual where 0<>1 and current_date < qwe.todate(0);
  23. (18) параллелизм смотри

или зарегистрируйтесь чтобы ответить!