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

Pourquoi EXECUTE IMMEDIATE est nécessaire ici ?

L'ensemble du bloc PL/SQL est analysé au moment de la compilation, mais le texte d'une instruction dynamique n'est pas évalué avant l'exécution. (Ils sont proches de la même chose pour un bloc anonyme, mais toujours des étapes distinctes).

Votre if/else n'est pas évalué avant l'exécution non plus. Le compilateur ne sait pas que la table existera toujours au moment où vous faites votre insertion, il peut seulement vérifier si elle existe ou non au moment où il analyse le bloc entier.

Si la table existe déjà, c'est OK ; le compilateur peut le voir, le bloc s'exécute, votre select obtient 1, et vous allez dans le else pour faire l'insertion. Mais s'il n'existe pas, l'analyse de l'insert échoue correctement avec ORA-00942 au moment de la compilation et rien dans le bloc n'est exécuté.

Étant donné que la création de la table est dynamique, toutes les références à la table doivent également être dynamiques - votre insertion comme vous l'avez vu, mais aussi si vous l'interrogez ensuite. Fondamentalement, cela rend votre code beaucoup plus difficile à lire et peut masquer les erreurs de syntaxe - puisque le code dynamique n'est pas analysé avant l'exécution, et il est possible que vous ayez une erreur dans une instruction dynamique dans une branche qui n'est pas touchée pour un longtemps.

De toute façon, les tables temporaires globales ne doivent pas être créées à la volée. Ce sont des objets permanents avec des données temporaires, spécifiques à chaque session, et ne doivent pas être créés/supprimés dans le cadre de votre code d'application. (Aucune modification de schéma ne doit être apportée par votre application en général ; elle doit se limiter aux modifications de mise à niveau/maintenance et être contrôlée, pour éviter les erreurs, la perte de données et les effets secondaires inattendus ; les GTT ne sont pas différents).

Contrairement aux tables temporaires dans certaines autres bases de données relationnelles, lorsque vous créez une table temporaire dans une base de données Oracle, vous créez une définition de table statique. La table temporaire est un objet persistant décrit dans le dictionnaire de données, mais apparaît vide jusqu'à ce que votre session insère des données dans la table. Vous créez une table temporaire pour la base de données elle-même, pas pour chaque procédure stockée PL/SQL.

Créez le GTT une fois et rendez tout votre code PL/SQL statique. Si vous voulez quelque chose de plus proche des tables temporaires locales de SQL Server, consultez les collections PL/SQL.