[英]Passing a ResultSet into a Postgresql Function
是否可以將postgres查詢的結果作為輸入傳遞給另一個函數?
作為一個非常人為的例子,說我有一個像
SELECT id, name
FROM users
LIMIT 50
我想創建一個函數my_function
,它接受第一個查詢的結果集並返回最小id。 這可能在pl / pgsql中嗎?
SELECT my_function(SELECT id, name FROM Users LIMIT 50); --returns 50
無法將通用類型RECORD的數組傳遞給plpgsql函數,而這正是您嘗試執行的操作。
您可以做的是傳入特定用戶定義的TYPE或特定表行類型的數組。 在下面的示例中,您還可以替換表名稱users []的參數數據類型(盡管這顯然意味着獲取users表行中的所有數據)。
CREATE TYPE trivial {
"ID" integer,
"NAME" text
}
CREATE OR REPLACE FUNCTION trivial_func(data trivial[])
RETURNS integer AS
$BODY$
DECLARE
BEGIN
--Implementation here using data
return 1;
END$BODY$
LANGUAGE 'plpgsql' VOLATILE;
我會在另一方面解決問題,為結果集的每個記錄調用一個聚合函數 。 它不是那么靈活,但可以給你一個提示。
作為示例來跟蹤您的示例問題:
CREATE OR REPLACE FUNCTION myMin ( int,int ) RETURNS int AS $$
SELECT CASE WHEN $1 < $2 THEN $1 ELSE $2 END;
$$ LANGUAGE SQL STRICT IMMUTABLE;
CREATE AGGREGATE my_function ( int ) (
SFUNC = myMin, STYPE = int, INITCOND = 2147483647 --maxint
);
SELECT my_function(id) from (SELECT * FROM Users LIMIT 50) x;
我認為沒有辦法將記錄集或表傳遞給函數(但如果我錯了,我會很高興)。 我建議的最好是傳遞數組:
create or replace function my_function(data int[])
returns int
as
$$
select min(x) from unnest(data) as x
$$
language SQL;
您可以使用光標 ,但這對於計算最小值非常不切實際。
我會為此目的使用臨時表 ,並傳遞表名以在動態SQL中使用:
CREATE OR REPLACE FUNCTION f_min_id(_tbl regclass, OUT min_id int) AS
$func$
BEGIN
EXECUTE 'SELECT min(id) FROM ' || _tbl
INTO min_id;
END
$func$ LANGUAGE plpgsql;
呼叫:
CREATE TEMP TABLE foo ON COMMIT DROP AS
SELECT id, name
FROM users
LIMIT 50;
SELECT f_min_id('foo');
第一個參數是regclass
類型,以防止SQL注入。 有關dba.SE的相關答案的更多信息 。
我將臨時表設置為ON COMMIT DROP
以將其生命周期限制為當前事務。 可能或不是你想要的。
您可以擴展此示例以獲取更多參數。 使用EXECUTE
搜索動態SQL的代碼示例 。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.