Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

A avaliação de curto-circuito CASE e COALESCE funciona com sequências em PL/SQL, mas não em SQL


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 )