La pregunta está a punto de usar una variable en un script significa para mí que se usará en SQL * Plus.
El problema es que perdió las comillas y Oracle no puede analizar el valor en 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
Esta muestra funciona bien debido a la conversión automática de tipo (o como se llame).
Si marca escribiendo DEFINE en SQL * Plus, mostrará que la variable num es CHAR.
SQL>define
DEFINE NUM = "2018" (CHAR)
No es un problema en este caso, porque Oracle puede manejar el análisis de cadenas a números si fuera un número válido.
Cuando la cadena no puede analizarse en número, Oracle no puede lidiar con ella.
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 una cita, así que no obligue a Oracle a analizar el número, estará bien:
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
Entonces, para responder la pregunta original, debería ser como esta muestra:
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
Hay otra forma de almacenar variables en SQL * Plus utilizando el valor de la columna de consulta .
El COL [UMN] tiene nuevo_valor opción para almacenar el valor de la consulta por el nombre 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;
Como puede ver, el valor X.log se configuró en la variable stupid_var , por lo que podemos encontrar que un archivo X.log en el directorio actual tiene algún registro.