首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle SQL*Plus 綁定變數完整指南:ACCEPT/DEFINE/& 替代變數與腳本參數傳遞

     編輯:Oracle 資料庫基礎

SQL*Plus 綁定變數 (Substitution Variables) 讓腳本具備互動與參數化能力。本文詳細說明 &/&& 替代語法、ACCEPT 互動輸入、DEFINE/UNDEFINE 預設值管理、字串/日期型別引號處理、腳本參數傳遞 (@script.sql p1 p2),並提供實戰範例與避坑清單。

替代變數語法

語法行為適用場景
&var每次遇到提示輸入 (可用 SET VERIFY OFF 關閉新舊值顯示)臨時互動查詢
&&var第一次提示後快取,同腳本後續直接使用腳本內重複引用同一參數

核心指令


-- 1. 互動式輸入 (ACCEPT)
ACCEPT dept_id NUMBER PROMPT 'Enter Department ID: '
ACCEPT emp_name CHAR PROMPT 'Enter Name: ' HIDE
ACCEPT hire_dt DATE FORMAT 'YYYY-MM-DD' PROMPT 'Hire Date (YYYY-MM-DD): '

-- 2. 預設值 (DEFINE)
DEFINE dept_id = 10
DEFINE emp_name = 'King'
-- 查看定義
DEFINE dept_id
-- 移除定義
UNDEFINE dept_id

-- 3. 關閉驗證顯示
SET VERIFY OFF   -- 隱藏 old/new 行
SET VERIFY ON    -- 顯示 (預設)

實戰範例

範例 1:數值型別直接使用


SELECT employee_id, last_name, salary
FROM employees
WHERE department_id = &dept_id;
-- 輸入 10 → WHERE department_id = 10

範例 2:字串/日期型別需加單引號


SELECT employee_id, last_name, salary
FROM employees
WHERE last_name = '&emp_name';          -- 字串
WHERE hire_date > TO_DATE('&start_dt', 'YYYY-MM-DD');  -- 日期
-- 輸入 King → WHERE last_name = 'King'
-- 輸入 2020-01-01 → TO_DATE('2020-01-01', 'YYYY-MM-DD')

範例 3:ACCEPT 完整參數化腳本


-- script.sql
SET VERIFY OFF
ACCEPT p_dept NUMBER PROMPT 'Dept ID: '
ACCEPT p_min_sal NUMBER PROMPT 'Min Salary: '
ACCEPT p_max_sal NUMBER PROMPT 'Max Salary: '

SELECT employee_id, last_name, salary, department_id
FROM employees
WHERE department_id = &p_dept
  AND salary BETWEEN &p_min_sal AND &p_max_sal
ORDER BY salary DESC;

腳本參數傳遞 (位置參數)


-- 呼叫方式
@script.sql 10 5000 10000
START script.sql 10 5000 10000

-- 腳本內部引用 &1, &2, &3 ... &9
SELECT * FROM employees
WHERE department_id = &1
  AND salary BETWEEN &2 AND &3;

避坑清單

問題原因解決
輸入含 & 字元報錯SQL*Plus 視為變數SET DEFINE OFF 或 SET SCAN OFF 或改用 SET DEFINE # 更換前綴
字串/日期未加單引號SQL 語法錯誤WHERE 子句中 '&var'、TO_DATE('&var','fmt')
數值輸入含千分位逗號轉換失敗ACCEPT ... NUMBER 自動驗證,或輸入前移除逗號
&&var 快取跨腳本殘留Session 級快取腳本結束執行 UNDEFINE var
腳本參數含空白參數分割錯誤用雙引號包裹 @script.sql "Sales Dept" 5000 → 腳本內 '&1'

最佳實務建議

  • 腳本開頭統一 SET VERIFY OFF SET FEEDBACK OFF (僅輸出結果)。
  • 使用 ACCEPT ... PROMPT 提供清楚提示,NUMBER/CHAR/DATE 型別驗證。
  • 生產環境部署腳本優先用位置參數 &1..&9,避免互動提示阻塞自動化流程。
  • 敏感資訊 (密碼) 使用 ACCEPT ... HIDE 或環境變數傳入,勿硬編碼。

善用 SQL*Plus 綁定變數,能將固定 SQL 轉為可重用、可參數化、可自動化的腳本,大幅提升 DBA 與開發者日常操作效率。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved