Câu hỏi là về việc sử dụng một biến trong tập lệnh có nghĩa là nó sẽ được sử dụng trong SQL * Plus.
Vấn đề là bạn đã bỏ lỡ các trích dẫn và Oracle không thể phân tích giá trị thành số.
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
Mẫu này hoạt động tốt vì chuyển đổi loại tự động (hoặc bất cứ thứ gì nó được gọi).
Nếu bạn kiểm tra bằng cách nhập DEFINE trong SQL * Plus, nó sẽ hiển thị biến num đó là CHAR.
SQL>define
DEFINE NUM = "2018" (CHAR)
Đây không phải là vấn đề trong trường hợp này, bởi vì Oracle có thể xử lý phân tích chuỗi thành số nếu đó là số hợp lệ.
Khi chuỗi không thể phân tích thành số, thì Oracle không thể xử lý nó.
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
Với một trích dẫn, vì vậy đừng buộc Oracle phân tích thành số, sẽ ổn thôi:
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
Vì vậy, để trả lời câu hỏi ban đầu, cần thực hiện như mẫu này:
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
Có một cách khác để lưu trữ biến trong SQL * Plus bằng cách sử dụng Giá trị cột truy vấn .
Các COL [UMN] có new_value tùy chọn để giá trị lưu trữ từ truy vấn bằng tên trường.
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;
Như bạn có thể thấy, giá trị X.log đã được đặt thành biến ngu_var , vì vậy chúng ta có thể tìm thấy tệp X.log trong thư mục hiện tại có một số đăng nhập.