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

Quelle est la différence entre les variables de liaison et les variables de substitution (que j'entre en utilisant &&) ?

Vous semblez avoir une certaine confusion sur les différences entre les variables de liaison dans Oracle et variables de substitution en SQL*Plus.

Commençons par les variables de substitution. Les variables de substitution sont propres à SQL*Plus et ne font pas partie de la base de données. Ils ne fonctionneront pas si vous essayez de les utiliser avec JDBC, par exemple.

Les variables de substitution ne peuvent contenir qu'un morceau de texte. Si SQL*Plus rencontre une variable de substitution dans une ligne d'entrée, il remplacera la variable par son contenu textuel :

SQL> define subvar=X
SQL> select * from dual where dummy = &subvar;
old   1: select * from dual where dummy = &subvar
new   1: select * from dual where dummy = X
select * from dual where dummy = X
                                 *
ERROR at line 1:
ORA-00904: "X": invalid identifier

Notez que SQL*Plus a remplacé notre variable de substitution par sa valeur textuelle sans se soucier de savoir si elle nous a donné un SQL valide. Dans l'exemple ci-dessus, nous avons omis les guillemets simples autour de &subvar et cela nous a donné SQL invalide, donc nous avons eu une erreur.

Les lignes commençant par old et new montrez-nous la ligne que nous avons saisie avant et après que SQL*Plus ait appliqué les variables de substitution. Le new ligne est la ligne que la base de données a tenté d'exécuter.

Vous pouvez activer ou désactiver l'affichage de l'old et new lignes en utilisant SET VERIFY ON et SET VERIFY OFF . Vous pouvez également activer ou désactiver le remplacement des variables de substitution en utilisant SET DEFINE ON et SET DEFINE OFF .

Si nous voulons exécuter la requête ci-dessus en utilisant la variable de substitution, nous devons mettre des guillemets autour :

SQL> select * from dual where dummy = '&subvar';
old   1: select * from dual where dummy = '&subvar'
new   1: select * from dual where dummy = 'X'

D
-
X

Si &subvar contient une chaîne qui était un nombre valide (par exemple, 5 ), alors nous pouvons nous en sortir sans utiliser les guillemets, mais c'est uniquement parce que nous supprimons le texte &subvar et en le remplaçant par le texte 5 arrive à nous donner du SQL valide.

Par exemple, supposons que nous ayons une table appelée test avec les données suivantes :

         A
----------
         1
         2
         3
         4
         5

Alors nous pouvons faire

SQL> define subvar=5
SQL> select * from test where a = &subvar;
old   1: select * from test where a = &subvar
new   1: select * from test where a = 5

         A
----------
         5

Les variables de liaison, en revanche, ont des types. Ce ne sont pas de simples valeurs textuelles. Leurs valeurs sont envoyées à la base de données, et la base de données peut également définir leurs valeurs.

SQL> variable bindvar varchar2(1);
SQL> exec :bindvar := 'X';

PL/SQL procedure successfully completed.

Vous ne mettez pas de guillemets autour d'une variable de liaison lorsque vous souhaitez l'utiliser :

SQL> select * from dual where dummy = :bindvar;

D
-
X

SQL> select * from dual where dummy = ':bindvar';

no rows selected

Dans le deuxième exemple ci-dessus, aucune ligne n'a été renvoyée car le DUAL la table n'a pas de lignes avec le DUMMY colonne contenant le texte :bindvar .

Vous obtiendrez une erreur si vous tentez d'attribuer une valeur du mauvais type à une variable liée :

SQL> variable bindvar number;
SQL> exec :bindvar := 'X';
BEGIN :bindvar := 'X'; END;

*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 1

Les variables de liaison font partie intégrante de la base de données et vous pouvez les utiliser avec JDBC ou la méthode de connexion à la base de données de votre choix.

Enfin, variable num1 number et var num1 number les deux signifient la même chose. Ils définissent tous les deux une variable de liaison num1 de type number . var est juste une abréviation pour variable .