Du verkar ha en viss förvirring om skillnaderna mellan bindningsvariabler i Oracle och substitutionsvariabler i SQL*Plus.
Låt oss börja med substitutionsvariabler. Substitutionsvariabler är unika för SQL*Plus och är inte en del av databasen. De kommer inte att fungera om du försöker använda dem med JDBC, till exempel.
Substitutionsvariabler kan bara innehålla ett stycke text. Om SQL*Plus stöter på en ersättningsvariabel i en inmatningsrad kommer den att ersätta variabeln med dess textinnehåll:
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
Observera att SQL*Plus ersatte vår substitutionsvariabel med dess textvärde utan hänsyn till om den gav oss giltig SQL. I exemplet ovan utelämnade vi de enskilda citattecken runt &subvar
och det gav oss ogiltig SQL, så vi fick ett fel.
Raderna som börjar old
och new
visa oss raden vi skrev in före och efter att SQL*Plus tillämpade substitutionsvariablerna. Den new
line är raden som databasen försökte köra.
Du kan aktivera eller inaktivera visningen av den old
och new
rader med SET VERIFY ON
och SET VERIFY OFF
. Du kan också aktivera eller inaktivera ersättningen av ersättningsvariabler genom att använda SET DEFINE ON
och SET DEFINE OFF
.
Om vi vill köra ovanstående fråga med hjälp av substitutionsvariabeln måste vi sätta citattecken runt 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
Om &subvar
råkar innehålla en sträng som var ett giltigt nummer (t.ex. 5
), då kan vi komma undan utan att använda citattecken, men det är bara för att vi tar ut texten &subvar
och ersätt den med texten 5
råkar ge oss giltig SQL.
Anta till exempel att vi har en tabell som heter test
med följande data i:
A ---------- 1 2 3 4 5
Då kan vi göra
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
Bindvariabler, å andra sidan, har typer. De är inte enkla textvärden. Deras värden skickas till databasen, och databasen kan också ställa in deras värden.
SQL> variable bindvar varchar2(1); SQL> exec :bindvar := 'X'; PL/SQL procedure successfully completed.
Du sätter inte citattecken runt en bindningsvariabel när du vill använda den:
SQL> select * from dual where dummy = :bindvar; D - X SQL> select * from dual where dummy = ':bindvar'; no rows selected
I det andra exemplet ovan fick vi inga rader returnerade eftersom DUAL
Tabellen har inga rader med DUMMY
kolumn som innehåller texten :bindvar
.
Du får ett felmeddelande om du försöker tilldela ett värde av fel typ till en bindningsvariabel:
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
Bindningsvariabler är en standarddel av databasen, och du kan använda dem med JDBC eller vilken metod som helst för att ansluta till databasen du väljer.
Slutligen, variable num1 number
och var num1 number
båda betyder samma sak. De definierar båda en bindningsvariabel num1
av typen number
. var
är bara en förkortning för variable
.