możliwość wydaje się mieć pewne zamieszanie na temat różnic między zmiennych powiązań w Oracle i zmiennych podstawiania w SQL * Plus.
Zacznijmy od zmiennych podstawiania. Zmienne zastępcze są unikalne dla SQL * Plus i nie są częścią bazy danych. Nie będą działać, jeśli spróbujesz użyć ich na przykład w JDBC.
Zmienne zastępcze mogą zawierać tylko fragment tekstu. Jeśli SQL * Plus napotka zmienną podstawienie na linii wejścia, będzie zastąpić zmienną z jego treścią tekstu:
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
Zauważ, że SQL * Plus otrzymuje naszą zmienną Podstawienie wartości tekstowej, bez względu na czy to przekazał nam prawidłowy kod SQL. W powyższym przykładzie pominięto pojedyncze cytaty o numerze &subvar
i otrzymano nieprawidłowy kod SQL, więc wystąpił błąd.
Linie rozpoczynające się old
i new
pokazują nam wiersz, który wprowadziliśmy przed i po SQL * Plus zastosował zmienne podstawiania. Linia new
jest linią, którą próbowała uruchomić baza danych.
Możesz włączyć lub wyłączyć wyświetlanie linii i new
przy użyciu SET VERIFY ON
i SET VERIFY OFF
. Można również włączyć lub wyłączyć zastępowanie zmiennych zastępczych za pomocą SET DEFINE ON
i .
Jeśli chcemy uruchomić powyższą kwerendę za pomocą zmiennej substytucji, musimy umieścić cudzysłowy wokół niego:
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
Jeśli &subvar
dzieje zawierają ciąg znaków, który był ważny numer (np 5
), potem może uciec bez używania cytatów, ale to tylko dlatego, że usunięcie tekstu &subvar
i zastąpienie go tekstem 5
dzieje się, aby dać nam prawidłowy kod SQL.
Na przykład, załóżmy, że mamy tabelę o nazwie test
z następującymi danymi w nim:
A
----------
1
2
3
4
5
Wtedy możemy zrobić
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
zmienne Bind, z drugiej strony, mają typy. Nie są to proste wartości tekstowe. Ich wartości są wysyłane do bazy danych, a baza danych może również ustawiać ich wartości.
SQL> variable bindvar varchar2(1);
SQL> exec :bindvar := 'X';
PL/SQL procedure successfully completed.
nie umieścić cudzysłowy wokół zmiennej bind, gdy chcesz go używać:
SQL> select * from dual where dummy = :bindvar;
D
-
X
SQL> select * from dual where dummy = ':bindvar';
no rows selected
W drugim przykładzie powyżej, mamy żadnych wierszy zwrócony ponieważ tabela DUAL
ma wiersze z kolumna DUMMY
zawierająca tekst :bindvar
.
Dostaniesz błąd, jeśli spróbujesz przypisać wartość niewłaściwy typ zmiennej wiąże:
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
zmienne powiązań są standardową częścią bazy danych i można z nich korzystać z JDBC lub dowolną metodę łączenia się z wybraną bazą danych.
Wreszcie variable num1 number
i var num1 number
oba oznaczają to samo. Oba definiują zmienną wiązania num1
typu . var
to skrót od variable
.