Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Jaka jest różnica między zmiennymi wiążącymi a zmiennymi podstawiania (które wprowadzam za pomocą &&)?

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 .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ostatnie słowo w zdaniu:W SQL (możliwe wyrażenia regularne?)

  2. 2PL, model rygorystyczny kontra ścisły, czy jest jakaś korzyść?

  3. Rozwiąż błąd PLS-00323 w Oracle

  4. Przeszukaj wszystkie pola we wszystkich tabelach pod kątem określonej wartości (Oracle)

  5. Jak uzyskać skrypt tabeli w Oracle SQL Developer?