Pertanyaannya adalah tentang menggunakan variabel dalam skrip berarti bagi saya itu akan digunakan dalam SQL * Plus.
Masalahnya adalah Anda melewatkan tanda kutip dan Oracle tidak dapat menguraikan nilai ke angka.
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
Sampel ini berfungsi dengan baik karena konversi tipe otomatis (atau apa pun namanya).
Jika Anda memeriksa dengan mengetikkan DEFINE di SQL * Plus, itu akan menunjukkan bahwa variabel num adalah CHAR.
SQL>define
DEFINE NUM = "2018" (CHAR)
Ini bukan masalah dalam kasus ini, karena Oracle dapat menangani string parsing ke nomor jika itu akan menjadi nomor yang valid.
Ketika string tidak dapat menguraikan angka, maka Oracle tidak bisa mengatasinya.
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
Dengan kutipan, jadi jangan memaksa Oracle untuk menguraikan angka, akan baik-baik saja:
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
Jadi, untuk menjawab pertanyaan awal, harus dilakukan seperti contoh ini:
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
Ada cara lain untuk menyimpan variabel dalam SQL * Plus dengan menggunakan Nilai Kolom Kueri .
The COL [UMN] memiliki new_value pilihan untuk menyimpan nilai dari query dengan nama field.
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;
Seperti yang Anda lihat, nilai X.log diatur ke dalam variabel stupid_var , sehingga kita dapat menemukan file X.log di direktori saat ini memiliki beberapa login di dalamnya.