Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Was ist der Unterschied zwischen Bindungsvariablen und Substitutionsvariablen (die ich mit &&eingebe)?

Sie scheinen einige Verwirrung über die Unterschiede zwischen Bind-Variablen zu haben in Oracle und Substitutionsvariablen in SQL*Plus.

Beginnen wir mit Substitutionsvariablen. Substitutionsvariablen sind einzigartig für SQL*Plus und nicht Teil der Datenbank. Sie funktionieren beispielsweise nicht, wenn Sie versuchen, sie mit JDBC zu verwenden.

Substitutionsvariablen können nur einen Text enthalten. Wenn SQL*Plus in einer Eingabezeile auf eine Substitutionsvariable stößt, ersetzt es die Variable durch ihren Textinhalt:

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

Beachten Sie, dass SQL*Plus unsere Substitutionsvariable durch ihren Textwert ersetzt hat, ohne Rücksicht darauf, ob es uns gültiges SQL gegeben hat. Im obigen Beispiel haben wir die einfachen Anführungszeichen um &subvar weggelassen und es gab uns ungültiges SQL, also bekamen wir einen Fehler.

Die Zeilen beginnen mit old und new Zeigen Sie uns die Zeile, die wir eingegeben haben, bevor und nachdem SQL*Plus die Substitutionsvariablen angewendet hat. Der new line ist die Zeile, die die Datenbank auszuführen versucht hat.

Sie können die Anzeige des old aktivieren oder deaktivieren und new Zeilen mit SET VERIFY ON und SET VERIFY OFF . Sie können die Ersetzung von Substitutionsvariablen auch ein- oder ausschalten, indem Sie SET DEFINE ON verwenden und SET DEFINE OFF .

Wenn wir die obige Abfrage mit der Substitutionsvariablen ausführen möchten, müssen wir sie in Anführungszeichen setzen:

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

Wenn &subvar zufällig eine Zeichenfolge enthält, die eine gültige Zahl war (z. B. 5 ), dann können wir ohne die Anführungszeichen davonkommen, aber das liegt nur daran, dass der Text &subvar herausgenommen wird und durch den Text 5 ersetzen gibt uns zufällig gültiges SQL.

Angenommen, wir haben eine Tabelle namens test mit den folgenden Daten darin:

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

Dann können wir tun

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-Variablen hingegen haben Typen. Sie sind keine einfachen Textwerte. Ihre Werte werden an die Datenbank gesendet, und die Datenbank kann auch ihre Werte festlegen.

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

PL/SQL procedure successfully completed.

Sie setzen keine Anführungszeichen um eine Bind-Variable, wenn Sie sie verwenden möchten:

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

D
-
X

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

no rows selected

Im zweiten obigen Beispiel wurden keine Zeilen zurückgegeben, weil DUAL Tabelle hat keine Zeilen mit dem DUMMY Spalte mit dem Text :bindvar .

Sie erhalten eine Fehlermeldung, wenn Sie versuchen, einer Bindungsvariablen einen Wert des falschen Typs zuzuweisen:

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-Variablen sind ein Standardbestandteil der Datenbank, und Sie können sie mit JDBC oder einer von Ihnen gewählten Verbindungsmethode zur Datenbank verwenden.

Schließlich variable num1 number und var num1 number beide bedeuten dasselbe. Beide definieren eine Bind-Variable num1 vom Typ number . var ist nur eine Abkürzung für variable .