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

ORA-01036 :nom/numéro de variable illégal lors de l'exécution d'une requête via C#

La cause première

Dans Oracle, vous avez trois types d'instructions SQL (et il existe en plus des blocs PL/SQL) :

  • Déclarations dans le langage de définition de données (DDL). Ces instructions modifient la structure de la base de données. Ils commencent généralement par les verbes "ALTER" ou "CREATE"
  • Déclarations dans le langage de modification de données (DML). Ces instructions modifient le contenu à l'intérieur des tables, laissant la structure de chaque table inchangée. Ces instructions commencent généralement par "INSERT", "MERGE" ou "DELETE".
  • Déclarations dans ce que j'appelle le "langage de requête" (il semble qu'il n'y ait pas de nom canonique pour celles-ci). Ces instructions commencent par le verbe "SELECT".

Les variables de liaison dans Oracle ne sont autorisées qu'à certains endroits spéciaux dans DML et les instructions de requête. Vous essayez d'utiliser des variables de liaison dans des endroits où elles ne sont pas autorisées. D'où l'erreur.

Solution

Construisez votre instruction sans variables de liaison. Construisez la chaîne de requête complète à la place en utilisant la concaténation de chaînes.

Si vous souhaitez nettoyer l'entrée avant de concaténer la chaîne, utilisez le package DBMS_ASSERT.

Contexte

Les variables de liaison ne peuvent être utilisées que lorsqu'Oracle peut créer un plan de requête sans connaître la valeur de la variable. Pour les instructions DDL, il n'y a pas de plan de requête. Par conséquent, les variables liées ne sont pas autorisées.

Dans les instructions DML et de requête, les variables de liaison ne sont autorisées que lorsqu'elles sont utilisées à l'intérieur d'un tuple (en ce qui concerne la théorie des ensembles sous-jacente), c'est-à-dire lorsque la valeur sera comparée à la valeur d'un tableau ou lorsque la valeur sera insérée dans un tableau . Ils ne sont pas autorisés à modifier la structure du plan d'exécution (par exemple, modifier la table cible ou modifier le nombre de comparaisons).