Pytanie dotyczy użycia zmiennej w skrypcie oznacza, że dla mnie będzie ona używana w SQL * Plus.
Problem polega na tym, że przegapiłeś cudzysłowy, a Oracle nie może przeanalizować wartości na liczbę.
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
Ten przykład działa dobrze z powodu automatycznej konwersji typu (lub jakkolwiek to się nazywa).
Jeśli zaznaczysz wpisując DEFINE w SQL * Plus, pokaże się, że zmienną num jest CHAR.
SQL>define
DEFINE NUM = "2018" (CHAR)
W tym przypadku nie stanowi to problemu, ponieważ Oracle może zająć się przetwarzaniem ciągu znaków na liczbę, jeśli byłaby to poprawna liczba.
Kiedy ciąg nie może przeanalizować liczby, Oracle nie może sobie z nim poradzić.
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
Z cytatem, więc nie zmuszaj Oracle do analizowania liczb, będzie dobrze:
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
Tak więc, aby odpowiedzieć na pierwotne pytanie, należy wykonać tę próbkę:
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
Istnieje inny sposób przechowywania zmiennych w SQL * Plus przy użyciu wartości kolumny zapytania .
COL [UMN] ma new_value opcję do przechowywania wartości z kwerendy przy nazwie pola.
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;
Jak widać, wartość X.log została ustawiona w zmiennej stupid_var , więc możemy znaleźć plik X.log w bieżącym katalogu, w którym jest jakiś dziennik.