将ResultSet传递给Postgresql函数

Ben*_*ner 9 sql postgresql plpgsql postgresql-9.2

是否可以将postgres查询的结果作为输入传递给另一个函数?

作为一个非常人为的例子,说我有一个像

SELECT id, name
FROM users
LIMIT 50
Run Code Online (Sandbox Code Playgroud)

我想创建一个函数my_function,它接受第一个查询的结果集并返回最小的id.这可能在pl/pgsql中吗?

SELECT my_function(SELECT id, name FROM Users LIMIT 50); --returns 50
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 5

您可以使用游标,但这对于计算最小值来说非常不切实际。

为此,我将使用临时表,并传递表名以在动态 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;
Run Code Online (Sandbox Code Playgroud)

称呼:

CREATE TEMP TABLE foo ON COMMIT DROP AS
SELECT id, name
FROM   users
LIMIT  50;

SELECT f_min_id('foo');
Run Code Online (Sandbox Code Playgroud)

主要观点

-> SQLfiddle 演示


Le *_*oid 5

我会从另一方面考虑这个问题,为结果集的每个记录调用一个聚合函数。它不那么灵活,但可以给你一个工作的提示。

作为遵循您的示例问题的示例:

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; 
Run Code Online (Sandbox Code Playgroud)


Rom*_*kar 2

我认为没有办法将记录集或表传递到函数中(但如果我错了,我会很高兴)。我最好的建议是传递数组:

create or replace function my_function(data int[])
returns int
as
$$
   select min(x) from unnest(data) as x
$$
language SQL;
Run Code Online (Sandbox Code Playgroud)

sql 小提琴演示