首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PostgreSQL 函數參數突破 32 個限制:使用複合類型封裝傳遞

     編輯:MySQL 資料庫相關知識

問題背景

PostgreSQL 函數參數上限 32 個。需傳遞更多參數時,可定義複合類型封裝。

解決方案:View + 複合類型鏈式封裝

-- 1. 定義複合類型
CREATE VIEW test_view (p1, p2) AS SELECT CAST(NULL AS INT), CAST(NULL AS INT);

-- 2. 基礎封裝函數:單參數 → 複合類型
CREATE OR REPLACE FUNCTION test_rec3(INT) RETURNS test_view AS $$
DECLARE
    v test_view%ROWTYPE;
BEGIN
    v.p1 := $1; v.p2 := 0;
    RETURN v;
END; $$ LANGUAGE plpgsql;

-- 3. 中間封裝:複合類型 + 參數 → 更新後的複合類型
CREATE OR REPLACE FUNCTION test_rec2(test_view, INT) RETURNS test_view AS $$
DECLARE
    v ALIAS FOR $1;
BEGIN
    v.p2 := $2;
    RETURN v;
END; $$ LANGUAGE plpgsql;

-- 4. 入口函數:多參數 → 最終複合類型
CREATE OR REPLACE FUNCTION test_rec1(INT, INT) RETURNS test_view AS $$
DECLARE
    v1 test_view%ROWTYPE;
    v2 test_view%ROWTYPE;
BEGIN
    v1.p1 := 2; v1.p2 := 3;
    SELECT * INTO v2 FROM test_rec2(test_rec3($1), $2);
    RETURN v2;
END; $$ LANGUAGE plpgsql;

原理說明

  • test_rec3 將單一參數封裝為 test_view 型別
  • test_rec2 接收複合類型並追加/修改欄位
  • 鏈式呼叫 test_rec2(test_rec3($1), $2) 實現多參數聚合
  • 最終以單一複合類型變數傳遞,繞過 32 參數限制

擴充至 N 參數

依樣畫葫蘆建立 test_rec4、test_rec5... 每層增加一組欄位,入口函數鏈式嵌套即可。

現代替代方案(PostgreSQL 9.5+)

  • JSON/JSONB:CREATE FUNCTION f(params JSONB) RETURNS ... 單參數攜帶任意結構
  • VARIADIC:CREATE FUNCTION f(VARIADIC INT[]) ... 陣列參數
  • Record 輸入:CREATE FUNCTION f(INOUT r RECORD) ... 配合 CALL f((1,2,3)::RECORD)

建議新專案優先使用 JSONB 方案,結構靈活且易於擴充。

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