La question est sur le point d'utiliser une variable dans un script signifie pour moi qu'elle sera utilisée dans SQL * Plus.
Le problème est que vous avez manqué les citations et Oracle ne peut pas analyser la valeur en nombre.
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
Cet exemple fonctionne très bien en raison de la conversion automatique de type (ou peu importe son nom).
Si vous vérifiez en tapant DEFINE dans SQL * Plus, cela montrera que la variable num est CHAR.
SQL>define
DEFINE NUM = "2018" (CHAR)
Ce n'est pas un problème dans ce cas, car Oracle peut gérer l'analyse de chaîne en nombre s'il s'agit d'un nombre valide.
Lorsque la chaîne ne peut pas analyser en nombre, Oracle ne peut pas y faire face.
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
Avec un devis, alors ne forcez pas Oracle à analyser le nombre, tout ira 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
Donc, pour répondre à la question d'origine, il devrait être fait comme cet exemple:
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
Il existe un autre moyen de stocker une variable dans SQL * Plus à l'aide de la valeur de colonne de requête .
Le COL [UMN] a l' option new_value pour stocker la valeur de la requête par nom de champ.
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;
Comme vous pouvez le voir, la valeur X.log a été définie dans la variable stupid_var , nous pouvons donc trouver un fichier X.log dans le répertoire actuel contenant un journal.