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 .