A questão está prestes a usar uma variável em um script significa que, para mim, ela será usada no SQL * Plus.
O problema é que você perdeu as aspas e o Oracle não pode analisar o valor em número.
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
Este exemplo funciona bem devido à conversão automática de tipo (ou como ele é chamado).
Se você verificar digitando DEFINE no SQL * Plus, isso mostrará que a variável num é CHAR.
SQL>define
DEFINE NUM = "2018" (CHAR)
Não é um problema neste caso, porque o Oracle pode lidar com a análise de sequência de números, se for um número válido.
Quando a sequência não pode analisar o número, o Oracle não pode lidar com ela.
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
Com uma cotação, portanto, não force o Oracle a analisar o número, tudo bem:
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
Portanto, para responder à pergunta original, faça o seguinte:
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
Há uma outra maneira de armazenar variáveis no SQL * Plus usando Valor da Coluna de Consulta .
O COL [UMN] tem new_value opção para armazenar o valor da consulta pelo nome do 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;
Como você pode ver, o valor X.log foi definido na variável stupid_var , para que possamos encontrar um arquivo X.log no diretório atual com algum log.