Sembra che tu abbia una certa confusione sulle differenze tra bind variabili in Oracle e variabili di sostituzione in SQL*Plus.
Iniziamo con le variabili di sostituzione. Le variabili di sostituzione sono univoche per SQL*Plus e non fanno parte del database. Non funzioneranno se provi a usarli 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, sostituirà 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 ha sostituito la nostra variabile di sostituzione con il suo valore di testo indipendentemente dal fatto che ci fornisse un SQL valido. Nell'esempio sopra, abbiamo omesso le virgolette singole intorno a &subvar
e ci ha fornito un SQL non valido, quindi abbiamo ricevuto un errore.
Le righe che iniziano con old
e new
mostraci la riga che abbiamo inserito prima e dopo che SQL*Plus ha applicato le variabili di sostituzione. Il new
line è la riga che il database ha tentato di eseguire.
Puoi abilitare o disabilitare la visualizzazione del old
e new
righe utilizzando SET VERIFY ON
e SET VERIFY OFF
. Puoi anche attivare o disattivare la sostituzione delle variabili di sostituzione utilizzando SET DEFINE ON
e SET DEFINE OFF
.
Se vogliamo eseguire la query precedente utilizzando la variabile di sostituzione, dobbiamo racchiuderla tra virgolette:
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
capita di contenere una stringa che era un numero valido (ad es. 5
), quindi possiamo cavarcela senza usare le virgolette, ma è solo perché eliminando il testo &subvar
e sostituendolo con il testo 5
capita di darci un SQL valido.
Ad esempio, supponiamo di avere una tabella chiamata test
con i seguenti dati:
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
Le variabili di associazione, d'altra parte, hanno tipi. Non sono semplici valori di testo. I loro valori vengono inviati al database e il database può anche impostarne i valori.
SQL> variable bindvar varchar2(1); SQL> exec :bindvar := 'X'; PL/SQL procedure successfully completed.
Non metti le virgolette attorno a una variabile bind quando vuoi usarla:
SQL> select * from dual where dummy = :bindvar; D - X SQL> select * from dual where dummy = ':bindvar'; no rows selected
Nel secondo esempio sopra, non abbiamo ricevuto righe restituite perché DUAL
la tabella non ha righe con il DUMMY
colonna contenente il testo :bindvar
.
Riceverai un errore se tenti di assegnare un valore del tipo sbagliato a una variabile di collegamento:
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
Le variabili di associazione sono una parte standard del database e puoi usarle con JDBC o qualsiasi metodo di connessione al database che scegli.
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 di variable
.