sql >> Databasteknik >  >> RDS >> Oracle

Vad är skillnaden mellan bindningsvariabler och substitutionsvariabler (som jag matar in med &&)?

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 .




  1. 3 områden som kommer att dra nytta av att använda ett SQL Server-prestandaövervakningsverktyg

  2. Grundläggande tabelluttryck, del 5 – CTE:er, logiska överväganden

  3. Introduktion till PL/SQL-undantagshantering i Oracle Database

  4. MariaDB JSON_EXISTS() Förklarad