Per PL/SQL Oracle assicura che utilizzerà la valutazione del cortocircuito:
Da:2 nozioni di base sul linguaggio PL/SQL
Quando usi il nextval
nel codice SQL, abbiamo una situazione diversa.
Prima di tutto dobbiamo tenere a mente che currval
e nextval
sono pseudocolonne:
Da:3 pseudocolonne .
La domanda ora è:perché Oracle valuta nextval
? o Questo comportamento è indicato da qualche parte?
Il tuo caso è chiaramente "1. Un'istruzione SELECT di primo livello", ma non significa che la logica di cortocircuito non sia a posto, ma solo che nextval
viene sempre valutato.
Se sei interessato alla logica di cortocircuito, allora è meglio rimuovere il nextval
dall'equazione.
Una query come questa non valuta la sottoquery:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Ma se prova a fare qualcosa di simile con coalesce
o case
vedremo che Oracle Optimizer decide di eseguire le sottoquery:
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Ho creato test annotati in questa demo in SQLFiddle per mostrarlo.
Sembra che Oracle applichi la logica di cortocircuito solo se con condizione OR, ma con coalesce
e case
deve valutare tutti i rami.
Penso che i tuoi primi test in PL/SQL mostrino che coalsce
e case
utilizzare una logica di cortocircuito in PL/SQL, come afferma Oracle. Il tuo secondo test, inclusa la sequenza nelle istruzioni SQL, mostra che in quel caso il nextval
viene comunque valutato, anche se il risultato non viene utilizzato, e anche Oracle lo documenta.
Mettere insieme le due cose sembra un po' strano, perché coalesce
e case
il comportamento sembra essere davvero incoerente anche per me, ma dobbiamo anche tenere presente che l'implementazione di tale logica dipende dall'implementazione (qui la mia fonte
)