在 SQL*Plus 中,用戶變量可用於參數化查詢、腳本復用與交互式輸入。定義變量主要有 DEFINE 與 ACCEPT 兩種方式,刪除用 UNDEFINE。
| 語法 | 說明 |
|---|---|
DEFINE | 顯示所有已定義變量 |
DEFINE var_name | 顯示指定變量名、值、類型 |
DEFINE var_name = value | 創建 CHAR 類型變量並賦初值 |
SQL> DEFINE temp = 20
SQL> DEFINE temp
DEFINE TEMP = "20" (CHAR)
SQL> SELECT * FROM dept WHERE deptno > &temp;
-- SQL*Plus 解析為:
SELECT * FROM dept WHERE deptno > 20;
結果:
DEPTNO DNAME LOC
---------- -------------- -------------
30 SALES CHICAGO
40 OPERATIONS BOSTON
ACCEPT variable [datatype] [format] [default] [prompt text | noprompt] [hide]
| 選項 | 說明 |
|---|---|
datatype | NUMBER / CHAR / DATE / BINARY_FLOAT / BINARY_DOUBLE |
format | 如 999、99.99、MM/DD/YYYY 等格式掩碼 |
default | 用戶直接回車時的預設值 |
prompt | 提示文本 |
hide | 隱藏輸入(密碼場景) |
noprompt | 無提示直接讀取 |
SQL> ACCEPT test NUMBER FORMAT 999 PROMPT '請輸入一個數字: '
請輸入一個數字: 20
SQL> SELECT * FROM dept WHERE deptno > &test;
-- 解析為 deptno > 20
結果同前。
SQL> ACCEPT pwd CHAR PROMPT 'Enter password: ' HIDE
Enter password:
-- 螢幕不回顯字符
&var_name:替換變量值(掃描一次)&&var_name:定義全局變量,首次提示輸入後複用,不再提示SET DEFINE OFF:關閉變量替換(防止 & 被誤識別)SET DEFINE ON:啟用(默認)SET SCAN ON/OFF:同 DEFINE(舊版本語法)
UNDEFINE temp
UNDEFINE test
ACCEPT + 類型檢查,避免注入風險。HIDE。BIND 變量 (VARIABLE) 而非替換變量,性能更優、類型更安全。DEFINE 確認變量值,防止殘留值導致邏輯錯誤。