sql >> Base de Datos >  >> RDS >> Oracle

La evaluación de cortocircuito CASE y COALESCE funciona con secuencias en PL/SQL pero no en SQL

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 )