Oracle 11g 提供豐富的函數參數傳遞語法,靈活運用能簡化代碼、提升可讀性並減少錯誤。本文以 add_three_numbers 函數為例,完整示範五種呼叫方式的語法與適用場景。
CREATE OR REPLACE FUNCTION add_three_numbers (
a NUMBER := 0,
b NUMBER := 0,
c NUMBER := 0
) RETURN NUMBER IS
BEGIN
RETURN a + b + c;
END;
/
按參數定義順序傳值,最傳統但易因順序錯誤導致 Bug。
BEGIN
DBMS_OUTPUT.PUT_LINE(add_three_numbers(2, 4, 5)); -- 結果 11
END;
/
指定參數名稱 參數名 => 值,順序可任意調換,強烈建議生產代碼使用,可讀性極高。
BEGIN
DBMS_OUTPUT.PUT_LINE(add_three_numbers(b => 3, a => 4, c => 2)); -- 結果 9
END;
/
前段用位置,後段用命名。規則:位置表示法必須在前,命名表示法在後,不可交錯。
BEGIN
DBMS_OUTPUT.PUT_LINE(add_three_numbers(3, b => 4, c => 2)); -- a=3, b=4, c=2 結果 9
END;
/
利用函數定義的預設值,僅傳遞需覆蓋的參數。配合命名表示法可跳過中間參數。
BEGIN
DBMS_OUTPUT.PUT_LINE(add_three_numbers(12, c => 2)); -- a=12, b=0(預設), c=2 結果 14
END;
/
在 SELECT 中直接呼叫 PL/SQL 函數,同樣支援命名/混合語法。
SELECT add_three_numbers(3, b => 4, c => 2) FROM DUAL; -- 結果 9
| 場景 | 推薦語法 | 理由 |
|---|---|---|
| 參數少(≤2)、順序固定、內部代碼 | 位置表示法 | 簡潔 |
| 參數多、有預設值、對外 API、團隊協作 | 命名表示法 | 自文檔化、防順序錯、可跳過參數 |
| 前幾個參數固定,後段參數可選 | 混合表示法 | 平衡簡潔與彈性 |
| SQL 查詢中呼叫 | 命名/混合表示法 | 同理,提升 SQL 可讀性 |
PRAGMA UDF 或結果快取優化)。ORA-14551。PRAGMA UDF / 結果快取。掌握 Oracle 函數的五種呼叫語法,特別是命名表示法與預設值配合省略表示法,能讓代碼更健壯、自文檔化且易於維護。建立團隊編碼規範,統一採用命名表示法作為預設風格,是提升代碼品質的低成本高回報實踐。