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

Pourquoi ne puis-je pas utiliser de variables de liaison dans les instructions DDL/SCL en SQL dynamique ?

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 écrit USING '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 || '''';