簡體   English   中英

將ResultSet傳遞給Postgresql函數

[英]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小提琴演示

您可以使用光標 ,但這對於計算最小值非常不切實際。

我會為此目的使用臨時表 ,並傳遞表名以在動態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');

主要觀點

- > SQLfiddle演示

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM