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
.