スクリプトで変数を使用するというのは、SQL * Plusで使用されるという意味です。
問題は、引用符を逃したことであり、Oracleは値を数値に解析できません。
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
このサンプルは、自動型変換(またはそれが呼び出されたもの)のため、正常に機能します。
SQL * PlusでDEFINEと入力してチェックすると、num変数がCHARであることが示されます。
SQL>define
DEFINE NUM = "2018" (CHAR)
Oracleは、文字列が有効な数値である場合、数値への解析文字列を処理できるため、この場合は問題になりません。
文字列が数値に解析できない場合、Oracleはそれを処理できません。
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
引用があるので、Oracleに数値まで解析させないでください。問題はありません。
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
したがって、元の質問に答えるには、次のサンプルのようにする必要があります。
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
Query Column Valueを使用してSQL * Plusに変数を格納する別の方法があります。
COL [UMN]はありNEW_VALUEクエリからフィールド名で保存値にオプションを選択します。
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;
ご覧のとおり、X.log値はstupid_var変数に設定されているため、現在のディレクトリにあるX.logファイルにログが含まれていることがわかります。