Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

sucesso inesperado da consulta


Se o otimizador decidir que não precisa avaliar uma função, ele não irá, então a função nunca lançará exceções:
select 1 from dual where 1 = 1 OR to_date('asdasdasd','asdasdasdas') > sysdate ;

         1
----------
         1

A função gera uma exceção somente se ela realmente for avaliada:
SQL> select 1 from dual where 1 = 1 AND to_date('asdasd','asdas') > sysdate ;
select 1 from dual where 1 = 1 AND to_date('asdasd','asdas') > sysdate
                                                    *
ERROR at line 1:
ORA-01821: date format not recognized

No entanto, se o analisador puder decidir estaticamente que a consulta é inválida - porque a função tem o tipo errado de argumentos ou a consulta tem tipos inválidos, então o analisador levantará uma exceção antes que o otimizador acerte:
SQL> select 1 from dual where 1 = 1 or to_date('asdasdasd',0) > sysdate ;
select 1 from dual where 1 = 1 or to_date('asdasdasd',0) > sysdate
                                                         *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER


SQL> select 1 from dual where 1 = 1 or to_date('asdasdasd','asdasdasdas') > 42 ;
select 1 from dual where 1 = 1 or to_date('asdasdasd','asdasdasdas') > 42
                                                                        *
ERROR at line 1:
ORA-00932: inconsistent datatypes: expected DATE got NUMBER