Si sembrano avere una certa confusione sulle differenze tra variabili di bind in Oracle e variabili di sostituzione in SQL * Plus.
Iniziamo con le variabili di sostituzione. Le variabili di sostituzione sono esclusive di SQL * Plus e non fanno parte del database. Non funzioneranno se si tenta di utilizzarli con JDBC, ad esempio.
Le variabili di sostituzione possono contenere solo una parte di testo. Se SQL * Plus incontra una variabile di sostituzione in una riga di input, che andrà a sostituire la variabile con il suo contenuto di testo:
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
Si noti che SQL * Plus sostituito nostra variabile di sostituzione con il suo valore di testo senza alcun riguardo per se è ci ha dato un SQL valido. Nell'esempio sopra, abbiamo omesso le virgolette singole intorno a &subvar
e ci ha fornito SQL non valido, quindi abbiamo ricevuto un errore.
Le righe che iniziano con old
e new
ci mostrano la riga che abbiamo inserito prima e dopo che SQL * Plus ha applicato le variabili di sostituzione. La riga new
è la riga che il database ha tentato di eseguire.
È possibile abilitare o disabilitare la visualizzazione delle linee old
e new
utilizzando SET VERIFY ON
e SET VERIFY OFF
. È inoltre possibile attivare o disattivare la sostituzione delle variabili di sostituzione utilizzando SET DEFINE ON
e SET DEFINE OFF
.
Se vogliamo eseguire la query sopra utilizzando la variabile di sostituzione, dobbiamo mettere le virgolette attorno ad esso:
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
Se &subvar
accade per contenere una stringa che era un numero valido (es 5
), allora noi può andare via senza usare le virgolette, ma questo è solo perché togliere il testo &subvar
e sostituirlo con il testo 5
avviene per darci un SQL valido.
Per esempio, supponiamo di avere una tabella denominata test
con i seguenti dati in esso:
A
----------
1
2
3
4
5
allora possiamo fare
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
variabili di bind, d'altra parte, hanno i tipi. Non sono semplici valori di testo. I loro valori vengono inviati al database e il database può anche impostare i loro valori.
SQL> variable bindvar varchar2(1);
SQL> exec :bindvar := 'X';
PL/SQL procedure successfully completed.
Non mettere le virgolette attorno a una variabile di legatura quando si desidera utilizzarlo:
SQL> select * from dual where dummy = :bindvar;
D
-
X
SQL> select * from dual where dummy = ':bindvar';
no rows selected
Nel secondo esempio di cui sopra, abbiamo ottenuto nessun righe restituite perché la tabella DUAL
non ha righe con la colonna DUMMY
contenente il testo :bindvar
.
Si otterrà un errore se si tenta di assegnare un valore del tipo sbagliato per una variabile bind:
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
variabili di bind sono una parte standard del database, e li è possibile utilizzare con JDBC o qualsiasi metodo di connessione al database scelto.
Infine, variable num1 number
e var num1 number
entrambi significano la stessa cosa. Entrambi definiscono una variabile di binding num1
di tipo number
. var
è solo un'abbreviazione per variable
.