Die Frage, ob eine Variable in einem Skript verwendet werden soll, bedeutet für mich, dass sie in SQL * Plus verwendet wird.
Das Problem ist, dass Sie die Anführungszeichen verpasst haben und Oracle den Wert nicht in Zahlen analysieren kann.
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
Dieses Beispiel funktioniert aufgrund der automatischen Typkonvertierung (oder wie auch immer es heißt) einwandfrei.
Wenn Sie dies durch Eingabe von DEFINE in SQL * Plus überprüfen, wird angezeigt, dass die Variable num CHAR ist.
SQL>define
DEFINE NUM = "2018" (CHAR)
In diesem Fall ist dies kein Problem, da Oracle das Parsen von Zeichenfolgen in Zahlen verarbeiten kann, wenn es sich um eine gültige Zahl handelt.
Wenn die Zeichenfolge nicht nach Zahlen analysiert werden kann, kann Oracle nicht damit umgehen.
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
Wenn Sie also ein Zitat verwenden und Oracle nicht zwingen, es nach Zahlen zu analysieren, ist dies in Ordnung:
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
Um die ursprüngliche Frage zu beantworten, sollte es wie folgt aussehen:
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
Es gibt eine andere Möglichkeit, Variablen in SQL * Plus mithilfe des Abfragespaltenwerts zu speichern .
Die COL [UMN] verfügt über die Option new_value , um den Wert der Abfrage nach Feldnamen zu speichern.
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;
Wie Sie sehen können, wurde der X.log-Wert in die Variable dumm_var gesetzt , sodass wir feststellen können, dass eine X.log-Datei im aktuellen Verzeichnis ein Protokoll enthält.