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
.