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
.