PostgreSQL 函數參數上限 32 個。需傳遞更多參數時,可定義複合類型封裝。
-- 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) 實現多參數聚合依樣畫葫蘆建立 test_rec4、test_rec5... 每層增加一組欄位,入口函數鏈式嵌套即可。
CREATE FUNCTION f(params JSONB) RETURNS ... 單參數攜帶任意結構CREATE FUNCTION f(VARIADIC INT[]) ... 陣列參數CREATE FUNCTION f(INOUT r RECORD) ... 配合 CALL f((1,2,3)::RECORD)建議新專案優先使用 JSONB 方案,結構靈活且易於擴充。