Wygląda na to, że masz pewne wątpliwości co do różnic między zmiennymi wiązania w Oracle i zmiennych podstawienia w SQL*Plus.
Zacznijmy od zmiennych substytucyjnych. Zmienne podstawiania są unikalne dla SQL*Plus i nie są częścią bazy danych. Nie będą działać, jeśli spróbujesz ich użyć na przykład z JDBC.
Zmienne podstawiania mogą zawierać tylko fragment tekstu. Jeśli SQL*Plus napotka zmienną podstawienia w wierszu wejściowym, zastąpi zmienną jej zawartością tekstową:
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 zamienił naszą zmienną podstawiania na jej wartość tekstową, nie zważając na to, czy podała nam poprawny kod SQL. W powyższym przykładzie pominęliśmy pojedyncze cudzysłowy wokół &subvar
i dał nam nieprawidłowy kod SQL, więc wystąpił błąd.
Linie zaczynające się old
i new
pokaż nam wiersz, który wprowadziliśmy przed i po zastosowaniu zmiennych podstawienia przez SQL*Plus. new
linia to linia, którą baza danych próbowała uruchomić.
Możesz włączyć lub wyłączyć wyświetlanie old
i new
wiersze przy użyciu SET VERIFY ON
i SET VERIFY OFF
. Możesz także włączyć lub wyłączyć zastępowanie zmiennych podstawiania za pomocą SET DEFINE ON
i SET DEFINE OFF
.
Jeśli chcemy uruchomić powyższe zapytanie za pomocą zmiennej podstawiania, musimy ją otoczyć cudzysłowami:
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
zawiera ciąg, który był poprawną liczbą (np. 5
), wtedy możemy uciec bez używania cudzysłowów, ale dzieje się tak tylko dlatego, że usuwamy tekst &subvar
i zastępując go tekstem 5
tak się składa, że daje nam poprawny SQL.
Załóżmy na przykład, że mamy tabelę o nazwie test
z następującymi danymi:
A ---------- 1 2 3 4 5
Wtedy możemy to 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
Z drugiej strony zmienne powiązania 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 umieszczasz cudzysłowów wokół zmiennej bind, kiedy chcesz jej użyć:
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 nie otrzymaliśmy zwróconych wierszy, ponieważ DUAL
tabela nie zawiera wierszy z DUMMY
kolumna zawierająca tekst :bindvar
.
Otrzymasz błąd, jeśli spróbujesz przypisać wartość niewłaściwego typu do zmiennej wiązania:
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 wiązania są standardową częścią bazy danych i można ich używać z JDBC lub dowolną metodą łączenia się z wybraną bazą danych.
Na koniec variable num1 number
i variable num1 number
oba oznaczają to samo. Obaj definiują zmienną wiązania num1
typu number
. var
to tylko skrót od variable
.