Pour PL/SQL, Oracle assure qu'il utilisera une évaluation en court-circuit :
De :2 fondamentaux du langage PL/SQL
Lorsque vous utilisez le nextval
en code SQL, nous avons une situation différente.
Tout d'abord, nous devons garder à l'esprit que currval
et nextval
sont des pseudo-colonnes :
De :3 pseudocolonnes .
La question est maintenant :pourquoi Oracle évalue nextval
? ou Ce comportement est-il indiqué quelque part ?
De :Pseudocolonnes de séquence
Votre cas est clairement "1. Une instruction SELECT de haut niveau", mais cela ne signifie pas que la logique de court-circuit n'est pas en place, mais seulement que nextval
est toujours évalué.
Si vous êtes intéressé par la logique de court-circuit, il est préférable de supprimer le nextval
de l'équation.
Une requête comme celle-ci n'évalue pas la sous-requête :
select 6 c
from dual
where 'a' = 'a' or 'a' = (select dummy from dual)
Mais si vous essayez de faire quelque chose de similaire avec coalesce
ou case
nous verrons que l'Oracle Optimizer décide d'exécuter les sous-requêtes :
select 6 c
from dual
where 'a' = coalesce('a', (select dummy from dual) )
J'ai créé des tests annotés dans cette démo dans SQLFiddle pour le montrer.
Il semble qu'Oracle applique la logique de court-circuit uniquement si avec la condition OR, mais avec coalesce
et case
il doit évaluer toutes les branches.
Je pense que vos premiers tests en PL/SQL montrent que coalsce
et case
utiliser une logique de court-circuit en PL/SQL, comme l'indique Oracle. Votre deuxième test, y compris la séquence dans les instructions SQL, montre que dans ce cas, le nextval
est évalué de toute façon, même si le résultat n'est pas utilisé, et Oracle documente également cela.
Assembler les deux choses semble un peu étrange, car coalesce
et case
moi aussi, le comportement semble vraiment incohérent, mais nous devons également garder à l'esprit que l'implémentation de cette logique dépend de l'implémentation (ici ma source
)