Oracle
 sql >> Database >  >> RDS >> Oracle

La valutazione del cortocircuito CASE e COALESCE funziona con sequenze in PL/SQL ma non in SQL

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?

Da:Pseudocolonne di sequenza

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 )