sql >> Database teknologi >  >> RDS >> Oracle

Hvad er forskellen mellem bindevariabler og substitutionsvariabler (som jeg indtaster ved hjælp af &&)?

Du ser ud til at have en vis forvirring om forskellene mellem bindingsvariabler i Oracle og substitutionsvariabler i SQL*Plus.

Lad os starte med substitutionsvariabler. Substitutionsvariabler er unikke for SQL*Plus og er ikke en del af databasen. De vil ikke fungere, hvis du for eksempel prøver at bruge dem med JDBC.

Substitutionsvariabler kan kun indeholde et stykke tekst. Hvis SQL*Plus støder på en substitutionsvariabel i en inputlinje, erstatter den variablen med dens tekstindhold:

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

Bemærk, at SQL*Plus erstattede vores substitutionsvariabel med dens tekstværdi uden hensyntagen til, om den gav os gyldig SQL. I eksemplet ovenfor har vi udeladt de enkelte anførselstegn omkring &subvar og det gav os ugyldig SQL, så vi fik en fejl.

Linjerne, der begynder old og new vis os den linje, vi indtastede før og efter SQL*Plus anvendte substitutionsvariablerne. Den new linje er den linje, databasen forsøgte at køre.

Du kan aktivere eller deaktivere visningen af ​​den old og new linjer ved hjælp af SET VERIFY ON og SET VERIFY OFF . Du kan også slå erstatningen af ​​substitutionsvariabler til eller fra ved at bruge SET DEFINE ON og SET DEFINE OFF .

Hvis vi ønsker at køre ovenstående forespørgsel ved hjælp af substitutionsvariablen, skal vi sætte anførselstegn omkring den:

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

Hvis &subvar tilfældigvis indeholder en streng, der var et gyldigt tal (f.eks. 5 ), så kan vi komme væk uden at bruge anførselstegnene, men det er kun fordi, at vi tager teksten &subvar ud. og erstatte det med teksten 5 tilfældigvis giver os gyldig SQL.

Antag for eksempel, at vi har en tabel kaldet test med følgende data i:

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

Så kan vi gøre det

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

Bind-variable har på den anden side typer. Det er ikke simple tekstværdier. Deres værdier sendes til databasen, og databasen kan også indstille deres værdier.

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

PL/SQL procedure successfully completed.

Du sætter ikke anførselstegn omkring en bindevariabel, når du vil bruge den:

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

D
-
X

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

no rows selected

I det andet eksempel ovenfor fik vi ingen rækker returneret, fordi DUAL tabellen har ingen rækker med DUMMY kolonne, der indeholder teksten :bindvar .

Du får en fejl, hvis du forsøger at tildele en værdi af den forkerte type til en bindevariabel:

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

Bind-variabler er en standarddel af databasen, og du kan bruge dem med JDBC eller hvilken som helst metode til at oprette forbindelse til databasen, du vælger.

Til sidst, variable num1 number og var num1 number begge betyder det samme. De definerer begge en bindevariabel num1 af typen number . var er kun en forkortelse for variable .




  1. MariaDB JSON_TABLE() Forklaret

  2. Flere opdateringer i MySQL

  3. Min BOB-erklæring virker ikke

  4. 911/112:En nødopkaldstjenestedatamodel