Oracle
 sql >> Base de données >  >> RDS >> Oracle

L'évaluation des courts-circuits CASE et COALESCE fonctionne avec des séquences en PL/SQL mais pas en SQL

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 )