คำถามเกี่ยวกับการใช้ตัวแปรในสคริปต์หมายความว่าสำหรับฉันมันจะถูกใช้ใน 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
ตัวอย่างนี้ใช้งานได้ดีเนื่องจากการแปลงประเภทอัตโนมัติ (หรืออะไรก็ตามที่เรียกว่า)
หากคุณตรวจสอบโดยพิมพ์ DEFINE ใน SQL * Plus จะแสดงว่าตัวแปร 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
มีวิธีอื่น ๆ ในการจัดเก็บตัวแปรใน 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 ในไดเร็กทอรีปัจจุบันซึ่งมีบางส่วนเข้าสู่ระบบ