Les variables de liaison ne sont pas autorisées dans les instructions DDL. Les déclarations suivantes entraîneront donc des erreurs :
-
Exemple 1 :instruction DDL . Causera ORA-01027 :les variables de liaison ne sont pas autorisées pour les opérations de définition de données
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( dummy_column NUMBER DEFAULT :def_val )' USING 42;
-
Exemple 2 :instruction DDL . Causera ORA-00904 : :identifiant invalide
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( :col_name NUMBER )' USING var_col_name;
-
Exemple 3 :instruction SCL . Causera ORA-02248 :option non valide pour ALTER SESSION
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = :cal' USING var_calendar_option;
Problème
Pour comprendre pourquoi cela se produit, nous devons examiner comment les instructions SQL dynamiques sont traitées.
Généralement, un programme d'application demande à l'utilisateur le texte d'une instruction SQL et les valeurs des variables hôtes utilisées dans l'instruction. Ensuite, Oracle analyse l'instruction SQL. Autrement dit, Oracle examine l'instruction SQL pour s'assurer qu'elle respecte les règles de syntaxe et fait référence à des objets de base de données valides. L'analyse implique également la vérification des droits d'accès à la base de données , en réservant les ressources nécessaires et en trouvant le chemin d'accès optimal.
Soulignement ajouté par le répondeur
Notez que l'étape d'analyse se produit avant lier toutes les variables à l'instruction dynamique. Si vous examinez les quatre exemples ci-dessus, vous réaliserez qu'il n'y a aucun moyen pour l'analyseur de garantir la validité syntaxique de ces instructions SQL dynamiques sans connaître les valeurs des variables de liaison.
- Exemple 1 :L'analyseur ne peut pas dire si la valeur de liaison sera valide. Et si au lieu de
USING 42
, le programmeur a écritUSING 'forty-two'
? - Exemple 2 :L'analyseur ne peut pas dire si
:col_name
serait un nom de colonne valide. Et si le nom de la colonne liée était'identifier_that_well_exceeds_thirty_character_identifier_limit'
? - Exemple 3 :valeurs pour
NLS_CALENDAR
sont des constantes intégrées (pour une version Oracle donnée ?). L'analyseur ne peut pas dire si la variable liée aura une valeur valide.
La réponse est donc que vous ne pouvez pas lier des éléments de schéma tels que des noms de table, des noms de colonne en SQL dynamique. Vous ne pouvez pas non plus lier les constantes intégrées .
Solution
Le seul moyen de référencer dynamiquement les éléments/constantes du schéma consiste à utiliser la concaténation de chaînes dans les instructions SQL dynamiques.
-
Exemple #1 :
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table ( dummy_column NUMBER DEFAULT ' || to_char(42) || ')';
-
Exemple 2 :
EXECUTE IMMEDIATE 'CREATE TABLE dummy_table (' || var_col_name || ' NUMBER )';
-
Exemple #3 :
EXECUTE IMMEDIATE 'ALTER SESSION SET NLS_CALENDAR = ''' || var_calendar_option || '''';