Para PL/SQL, Oracle asegura que utilizará la evaluación de cortocircuito:
De:2 Fundamentos del lenguaje PL/SQL
Cuando usas el nextval
en código SQL, tenemos una situación diferente.
En primer lugar tenemos que tener en cuenta que currval
y nextval
son pseudocolumnas:
De:3 pseudocolumnas .
La pregunta ahora es:por qué Oracle evalúa nextval
? o ¿Este comportamiento se indica en alguna parte?
De:Pseudocolumnas de secuencia
Su caso es claramente "1. Una declaración SELECT de nivel superior", pero no significa que la lógica de cortocircuito no esté en su lugar, sino solo que nextval
siempre se evalúa.
Si está interesado en la lógica de cortocircuito, entonces es mejor eliminar el nextval
de la ecuación.
Una consulta como esta no evalúa la subconsulta:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Pero si intenta hacer algo similar con coalesce
o case
veremos que Oracle Optimizer decide ejecutar las subconsultas:
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Creé pruebas anotadas en esta demostración en SQLFiddle para mostrar esto.
Parece que Oracle aplica la lógica de cortocircuito solo si tiene la condición OR, pero con coalesce
y case
tiene que evaluar todas las ramas.
Creo que tus primeras pruebas en PL/SQL muestran que coalsce
y case
use una lógica de cortocircuito en PL/SQL, como dice Oracle. Su segunda prueba, incluida la secuencia en las declaraciones SQL, muestra que en ese caso el nextval
se evalúa de todos modos, incluso si el resultado no se usa, y Oracle también lo documenta.
Poner las dos cosas juntas parece un poco extraño, porque coalesce
y case
el comportamiento también parece ser realmente inconsistente, pero también debemos tener en cuenta que la implementación de esa lógica depende de la implementación (aquí mi fuente
)