在 Oracle 開發與管理作業中,DEFINE(替代變數/主機變數)、VARIABLE(繫結變數)與 DECLARE(PL/SQL 區域變數)是三種最核心的變數機制。本文系統整理其語法、特性、適用場景與操作範例,助你精準選用。
本質:SQL*Plus 客戶端層面的字串替換機制,全為 CHAR 型別,Session 級有效。
-- 宣告並指定值(必須同步賦值)
DEFINE var_name = value
-- 顯示單一/所有變數
DEFINE var_name
DEFINE
-- 關閉/開啟替代功能
SET DEFINE OFF
SET DEFINE ON
&var_name:直接替換,等同文字取代。&var_name.:加點號明確界定變數結尾。&var 會提示輸入(臨時變數,DEFINE 指令查不到)。&var 不會被替換(視為字面字串)。SET DEFINE OFF 可避免誤觸發替換(如腳本含大量 & 符號)。本質:資料庫層面的變數,具資料型別,支援軟解析(一次解析、多次執行),Session 級有效。
-- 宣告(僅指定名稱與型別,不可賦值)
VARIABLE var_name NUMBER
VAR v_name VARCHAR2(100) -- 縮寫
-- 顯示定義/值
VARIABLE var_name
VAR
PRINT var_name
PRINT
BEGIN :var := value; END;EXECUTE:EXEC :var := valueCALL func(...) INTO :varEXEC proc(:var)VAR cur REFCURSOR → PRINT cur 直接顯示結果集。SQL/PL/SQL 中一律加冒號前綴::var_name。
使用繫結變數的 SQL,文本相同(含大小寫)、Session 環境一致時,優化器可重用執行計畫,避免硬解析開銷。可查詢 V$SQL / V$SQLAREA 的 EXECUTIONS 欄位驗證重用次數。
本質:PL/SQL 區塊宣告區定義的區域變數,具完整型別系統(標量、記錄、集合、REF CURSOR 等),僅在區塊內可見,區塊結束即銷毀。
DECLARE
v_id NUMBER := 1;
v_name VARCHAR2(50) := 'Test';
v_rec employees%ROWTYPE;
v_arr SYS.ODCIVARCHAR2LIST;
BEGIN
-- 程式邏輯
NULL;
END;
/
%TYPE、%ROWTYPE 錨定型別,自動同步資料表結構變更。CONSTANT)、例外、游標、巢狀區塊變數。USING 繫結變數。| 維度 | DEFINE | VARIABLE | DECLARE |
|---|---|---|---|
| 層級 | 客戶端 | 資料庫 | PL/SQL 區塊 |
| 型別 | 僅 CHAR | 完整 SQL 型別 | 完整 PL/SQL 型別 |
| 可見範圍 | Session | Session | 區塊內部 |
| 替換/繫結時機 | 送資料庫前(文字替換) | 執行期(繫結) | PL/SQL 執行期 |
| 主要用途 | 腳本參數化、動態建構 | 效能優化、應用程式介面 | 程式邏輯運算、暫存中間結果 |
| Java/JDBC 對應 | 不適用 | PreparedStatement 參數 | 不直接對應 |
PreparedStatement、ODP.NET 參數),禁用字串拼接。DEFINE 處理環境參數,VARIABLE 搭配 PL/SQL 處理複雜邏輯與結果回傳。DECLARE 區域變數與靜態 SQL;動態 SQL 必須 USING 繫結。V$SQLAREA.EXECUTIONS 確認高頻 SQL 達到軟解析重用。理解 DEFINE/VARIABLE/DECLARE 三者的層級、型別、生命週期與繫結機制,是撰寫高效、安全 Oracle 程式的基石。依據「誰在用、用在哪、為何用」精準選擇,即能發揮各機制最大效益。