Oracle
 sql >> Database >  >> RDS >> Oracle

Qual è la differenza tra le variabili di collegamento e le variabili di sostituzione (che inserisco usando &&)?

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 .