2011-10-16 20 views
6

Qual è la differenza tra queste due dichiarazioni variabili?Qual è la differenza tra le variabili di bind e la variabile che immetto usando &&?

1: num number:='&&num';
2: variable num1 number;

Dato che in entrambi i casi posso riferire num utilizzando &num o &&num in altri file anche, e nel caso di variabili di bind :num1.

Inoltre ho un'altra confusione: se una delle seguenti affermazioni differisce in qualche modo, sono entrambe valide e significano la stessa cosa?

1: variable num1 number;
2: var num1 number;

risposta

29

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.

Problemi correlati