Para PL/SQL, a Oracle garante que usará avaliação de curto-circuito:
De:2 Fundamentos da linguagem PL/SQL
Quando você usa o
nextval
no código SQL, temos uma situação diferente. Em primeiro lugar, devemos ter em mente que
currval
e nextval
são pseudocolunas:De:3 pseudocolunas .
A questão agora é:por que a Oracle avalia
nextval
? ou Este comportamento é declarado em algum lugar? De:Pseudocolunas de sequência
Seu caso é claramente "1. Uma instrução SELECT de nível superior", mas isso não significa que a lógica de curto-circuito não esteja em vigor, mas apenas que
nextval
é sempre avaliado. Se você estiver interessado na lógica de curto-circuito, é melhor remover o
nextval
da equação. Uma consulta como esta não avalia a subconsulta:
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Mas se tentar fazer algo semelhante com
coalesce
ou case
veremos que o Oracle Optimizer decide executar as subconsultas:select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
Criei testes anotados esta demonstração no SQLFiddle para mostrar isso.
Parece que o Oracle aplica a lógica de curto-circuito apenas se com condição OR, mas com
coalesce
e case
ele tem que avaliar todos os ramos. Acho que seus primeiros testes em PL/SQL mostram que
coalsce
e case
use uma lógica de curto-circuito em PL/SQL, como afirma o Oracle. Seu segundo teste, incluindo a sequência nas instruções SQL, mostra que, nesse caso, o nextval
é avaliado de qualquer maneira, mesmo que o resultado não seja usado, e o Oracle também documenta isso. Juntar as duas coisas parece um pouco estranho, porque
coalesce
e case
comportamento parece ser muito inconsistente também para mim, mas também temos que ter em mente que a implementação dessa lógica depende da implementação (aqui minha fonte
)