La cuestión está a punto de utilizar una variable en un script significa para mí se va a utilizar en SQL * Plus.
El problema es que ha omitido las comillas y Oracle no puede analizar el valor del 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 ejemplo funciona bien debido a la conversión de tipo automática (o como se llame).
Si marca escribiendo DEFINE en SQL * Plus, se mostrará que la variable num es CHAR.
SQL>define
DEFINE NUM = "2018" (CHAR)
no es un problema en este caso, ya que Oracle puede tratar con una cuerda de análisis para numerar si sería un número válido.
Cuando la cadena no puede analizar el número, Oracle no puede manejarlo.
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, por lo que no obliga a Oracle para analizar a número, va a 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
Por lo tanto, para responder a la pregunta original, debe ser hacer como este ejemplo:
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 Columna de consulta Valor.
El COL [UMN] tiene opción nuevo_valor 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 se puede ver, el valor X.log fue establecido en el variables stupid_var, por lo que podemos encontrar un archivo X.log en el directorio actual tiene algo de registro en el mismo.
nombres realmente estúpido :) –