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

Pourquoi ne pouvons-nous pas exécuter la procédure stockée dans l'instruction select d'Oracle ? y a-t-il une raison forte ?

Les procédures ne sont pas autorisées dans les instructions SQL car mélanger les styles de programmation déclaratif et impératif est déroutant.

Une instruction SQL est une liste de conditions - c'est à Oracle de décider comment produire le jeu de résultats qui correspond à ces conditions. Une procédure stockée PL/SQL est un ensemble d'instructions qui modifient les choses de manière très prévisible.

Dans l'exemple ci-dessous, combien de fois doit pr être exécuté? Est-il exécuté avant ou après id = 1 ? Si les instructions SQL avaient un ordre prédéfini, l'optimiseur ne serait pas en mesure de pousser les prédicats, de fusionner les sous-requêtes, etc., et les performances seraient inacceptables.

select *
from table1
where id = 1
    and pr;

Même si une procédure a été utilisée dans le select liste, cela peut ne pas avoir de sens. Par exemple, le select liste à l'intérieur d'un exists est toujours ignoré.

select * from dual where exists (select pr from dual);

Mais en réalité, les instructions SQL doivent parfois interagir avec le monde extérieur, et une certaine logique procédurale est nécessaire. Les fonctions sont autorisées car elles généralement il suffit de calculer quelque chose et de renvoyer une valeur. Les fonctions ne dépendent normalement pas de l'état du programme et ont beaucoup d'effets secondaires. Vos fonctions pourraient utiliser les variables de session, mettre à jour les tables (s'il est défini sur PRAGMA AUTONOMOUS TRANSACTION ), définissez un contexte, etc. Oracle ne peut pas vous empêcher de faire ces choses, mais interdire les procédures dans les instructions SQL découragera au moins un tel code.