2011-10-16 16 views
6

Jaka jest różnica między tymi dwoma deklaracjami zmiennych?Jaka jest różnica między zmiennymi powiązania a zmienną, którą wprowadzam za pomocą &&?

1: num number:='&&num';
2: variable num1 number;

Ponieważ w obu przypadkach można odwołać num stosując &num lub &&num innych plików również w przypadku zmiennych wiążą :num1.

Co więcej, mam jeszcze jedno zamieszanie: czy któreś z poniższych stwierdzeń różni się w jakiś sposób, czy są one ważne i czy mają na myśli to samo?

1: variable num1 number;
2: var num1 number;

Odpowiedz

29

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.

Powiązane problemy