PostgreSQL函数返回多个结果集

Mar*_*kus 17 postgresql plpgsql

是否可以从Postgres函数返回多个结果集,如在MSSQL中:

CREATE PROCEDURE test

AS

SELECT * FROM first_table

SELECT * FROM second_table
Run Code Online (Sandbox Code Playgroud)

Erw*_*ter 14

自PostgreSQL 8.3以来,一种更简单的方法:

CREATE FUNCTION test()
  RETURNS SETOF first_table AS
$func$
BEGIN

RETURN QUERY
SELECT * FROM first_table;

RETURN QUERY
SELECT * FROM second_table;   -- has to return same rowtype as first_table!

END
$func$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

呼叫:

SELECT * FROM test();
Run Code Online (Sandbox Code Playgroud)

两个结果集都附加到从函数返回的单个集合中.
请参阅手册RETURN QUERY.

  • 什么是不同的行类型?有什么办法吗?除了光标.我希望在一个电话上获得两个记录集. (3认同)
  • @UdeetSolanki:不可能作为函数的直接结果。有多种解决方法:使用游标、临时表、像`json` 这样的文档类型。我建议你问一个新问题,评论不是地方。 (3认同)

Fra*_*uma 8

CREATE OR REPLACE FUNCTION "pr_GetCustomersAndOrders"()
RETURNS SETOF refcursor AS
$BODY$DECLARE
customerRC refcursor;
orderRC refcursor;
BEGIN
open customerRC FOR
SELECT * FROM customers;
RETURN NEXT customerRC;

open orderRC FOR
SELECT * FROM orders;
RETURN NEXT orderRC;
RETURN;
END;$BODY$
LANGUAGE 'plpgsql' VOLATILE;
ALTER FUNCTION "pr_GetCustomersAndOrders"() OWNER TO postgres;
Run Code Online (Sandbox Code Playgroud)

我喜欢使用refcursors :)

  • 把它装到我的桌子上我得到:`SELECT [*FROM]"pr_GetCustomersAndOrders"(); pr_GetCustomersAndOrders -------------------------- <unnamed portal 11> <unnamed portal 12>`使用psql 9.1. (4认同)
  • 同样在这里 (4认同)

tom*_*mym -1

是的。

例子:

test=# create function x () returns setof integer language plpgsql as $$ begin return next 1; return next 2; end $$;
CREATE FUNCTION
test=# select * from x();
 x 
---
 1
 2
(2 rows)
Run Code Online (Sandbox Code Playgroud)

您当然可以使用现有的表/视图或自定义类型作为返回类型。

使用 SQL 语言的示例:

test=# create table customer (name varchar, birth_date date);
CREATE TABLE
test=# create function y () returns setof customer language sql as $$ 
select * from customer
union all
select * from customer
$$;
CREATE FUNCTION
test=# insert into customer values ('joe', now()::date);
INSERT 0 1
test=# insert into customer values ('jill', now()::date);
INSERT 0 1
test=# select * from y();
 name | birth_date 
------+------------
 joe  | 2009-04-16
 jill | 2009-04-16
 joe  | 2009-04-16
 jill | 2009-04-16
(4 rows)
Run Code Online (Sandbox Code Playgroud)

请参阅此处的文档

  • 您只使用 1 个表,即“customer”表。问题是关于多个结果集! (4认同)