질문은 스크립트에서 변수를 사용하려고한다는 것입니다 .SQL * Plus에서 사용됩니다.
문제는 당신이 따옴표를 놓 쳤고 오라클은 값을 숫자로 파싱 할 수 없다는 것입니다.
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 파일에 로그가 있습니다.