sql >> Databáze >  >> RDS >> Oracle

Jaký je rozdíl mezi vazebnými proměnnými a substitučními proměnnými (které zadám pomocí &&)?

Zdá se, že máte nějaké nejasnosti ohledně rozdílů mezi proměnnými vazby v Oracle a substituční proměnné v SQL*Plus.

Začněme substitučními proměnnými. Substituční proměnné jsou jedinečné pro SQL*Plus a nejsou součástí databáze. Nebudou fungovat, pokud se je pokusíte použít například s JDBC.

Substituční proměnné mohou obsahovat pouze část textu. Pokud SQL*Plus narazí na substituční proměnnou v řádku vstupu, nahradí proměnnou svým textovým obsahem:

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

Všimněte si, že SQL*Plus nahradil naši substituční proměnnou svou textovou hodnotou bez ohledu na to, zda nám poskytl platný SQL. Ve výše uvedeném příkladu jsme vynechali jednoduché uvozovky kolem &subvar a to nám dalo neplatný SQL, takže jsme dostali chybu.

Řádky začínající old a new ukažte nám řádek, který jsme zadali před a poté, co SQL*Plus použil substituční proměnné. new řádek je řádek, který se databáze pokusila spustit.

Můžete povolit nebo zakázat zobrazení old a new pomocí SET VERIFY ON a SET VERIFY OFF . Nahrazování substitučních proměnných můžete také zapnout nebo vypnout pomocí SET DEFINE ON a SET DEFINE OFF .

Pokud chceme spustit výše uvedený dotaz pomocí substituční proměnné, musíme ji umístit do uvozovek:

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

Pokud &subvar náhodou obsahuje řetězec, který byl platným číslem (např. 5 ), pak se můžeme dostat pryč bez použití uvozovek, ale to jen proto, že vyjmeme text &subvar a jeho nahrazením textem 5 náhodou nám poskytne platné SQL.

Předpokládejme například, že máme tabulku nazvanou test s následujícími údaji:

         A
----------
         1
         2
         3
         4
         5

Pak můžeme udělat

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

Na druhou stranu proměnné vazby mají typy. Nejsou to jednoduché textové hodnoty. Jejich hodnoty jsou odesílány do databáze a databáze může také nastavovat jejich hodnoty.

SQL> variable bindvar varchar2(1);
SQL> exec :bindvar := 'X';

PL/SQL procedure successfully completed.

Když proměnnou vazby chcete použít, neuvozujete ji:

SQL> select * from dual where dummy = :bindvar;

D
-
X

SQL> select * from dual where dummy = ':bindvar';

no rows selected

Ve druhém příkladu výše jsme nedostali žádné vrácené řádky, protože DUAL tabulka nemá žádné řádky s DUMMY sloupec obsahující text :bindvar .

Pokud se pokusíte přiřadit hodnotu nesprávného typu proměnné vazby, zobrazí se chyba:

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 proměnné jsou standardní součástí databáze a můžete je použít s JDBC nebo s jakýmkoliv způsobem připojení k databázi, který si zvolíte.

Nakonec variable num1 number a var num1 number oba znamenají totéž. Oba definují proměnnou vazby num1 typu number . var je pouze zkratka pro variable .




  1. SQLite AUTOINCREMENT

  2. Vložení seznamu<> do tabulky SQL Server

  3. Převést z RAW (16) Oracle na GUID .NET

  4. Nelze načíst DLL 'SqlServerSpatial.dll'