La domanda sta per usare una variabile in uno script significa per me che verrà usata in SQL * Plus.
Il problema è che hai perso le virgolette e Oracle non può analizzare il valore in numero.
SQL> DEFINE num = 2018
SQL> SELECT &num AS your_num FROM dual;
old 1: SELECT &num AS your_num FROM dual
new 1: SELECT 2018 AS your_num FROM dual
YOUR_NUM
----------
2018
Elapsed: 00:00:00.01
Questo esempio funziona perfettamente a causa della conversione automatica del tipo (o come viene chiamato).
Se si controlla digitando DEFINE in SQL * Plus, verrà mostrato che la variabile num è CHAR.
SQL>define
DEFINE NUM = "2018" (CHAR)
In questo caso non è un problema, perché Oracle può gestire l'analisi della stringa da numerare se si tratta di un numero valido.
Quando la stringa non può analizzare il numero, Oracle non può gestirla.
SQL> DEFINE num = 'Doh'
SQL> SELECT &num AS your_num FROM dual;
old 1: SELECT &num AS your_num FROM dual
new 1: SELECT Doh AS your_num FROM dual
SELECT Doh AS your_num FROM dual
*
ERROR at line 1:
ORA-00904: "DOH": invalid identifier
Con un preventivo, quindi non forzare Oracle ad analizzare il numero, andrà bene:
17:31:00 SQL> SELECT '&num' AS your_num FROM dual;
old 1: SELECT '&num' AS your_num FROM dual
new 1: SELECT 'Doh' AS your_num FROM dual
YOU
---
Doh
Quindi, per rispondere alla domanda originale, dovrebbe essere come in questo esempio:
SQL> DEFINE stupidvar = 'X'
SQL>
SQL> SELECT 'print stupidvar:' || '&stupidvar'
2 FROM dual
3 WHERE dummy = '&stupidvar';
old 1: SELECT 'print stupidvar:' || '&stupidvar'
new 1: SELECT 'print stupidvar:' || 'X'
old 3: WHERE dummy = '&stupidvar'
new 3: WHERE dummy = 'X'
'PRINTSTUPIDVAR:'
-----------------
print stupidvar:X
Elapsed: 00:00:00.00
Esiste un altro modo per archiviare le variabili in SQL * Plus utilizzando il valore Colonna query .
Il COL [UMN] ha nuovo_valore opzione per memorizzare il valore di query nome del campo.
SQL> COLUMN stupid_column_name new_value stupid_var noprint
SQL> SELECT dummy || '.log' AS stupid_column_name
2 FROM dual;
Elapsed: 00:00:00.00
SQL> SPOOL &stupid_var.
SQL> SELECT '&stupid_var' FROM DUAL;
old 1: SELECT '&stupid_var' FROM DUAL
new 1: SELECT 'X.log' FROM DUAL
X.LOG
-----
X.log
Elapsed: 00:00:00.00
SQL>SPOOL OFF;
Come puoi vedere, il valore X.log è stato impostato nella variabile stupid_var , quindi possiamo trovare un file X.log nella directory corrente con qualche log in esso.