Oracle
 sql >> Datenbank >  >> RDS >> Oracle

unerwarteter Abfrageerfolg

Wenn der Optimierer entscheidet, dass er eine Funktion nicht auswerten muss, tut er dies nicht, sodass die Funktion niemals Ausnahmen auslöst:

select 1 from dual where 1 = 1 OR to_date('asdasdasd','asdasdasdas') > sysdate ;

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

Die Funktion löst nur dann eine Ausnahme aus, wenn sie tatsächlich ausgewertet wird:

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

Allerdings, wenn der Parser statisch entscheiden kann dass die Abfrage ungültig ist - weil die Funktion den falschen Argumenttyp hat oder die Abfrage ungültige Typen hat, dann löst der Parser eine Ausnahme aus, bevor der Optimierer darauf einschlägt:

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