在Postgres中,是否可以像MSSQL一样从函数返回多个结果集:
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
在Postgres中,是否可以像MSSQL一样从函数返回多个结果集:
CREATE PROCEDURE test
AS
SELECT * FROM first_table
SELECT * FROM second_table
自从PostgreSQL 8.3版本以来,有一种更简单的方法:
CREATE FUNCTION test()
RETURNS SETOF first_table
LANGUAGE plpgsql AS
$func$
BEGIN
RETURN QUERY
SELECT * FROM first_table;
RETURN QUERY
SELECT * FROM second_table; -- same row type as first_table!
END
$func$;
SELECT * FROM test();
两个结果集都会附加到从函数返回的单个集合中。当然,行类型必须匹配。
请参阅《RETURN QUERY
》手册。
你可以返回多个游标,这与你必须依次从每个游标中FETCH
不完全相同。而且你必须在同一个事务中完成所有操作。手册中有一个代码示例。从函数中返回大量的行集可能会很有用。在大多数情况下,我宁愿依次运行每个SELECT
语句。
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;
换句话说,使用 refcursors :)
CREATE OR REPLACE FUNCTION public.TestReturnMultipleTales
(
param_coid integer,
ref1 refcursor,
ref2 refcursor
)
RETURNS SETOF refcursor
LANGUAGE 'plpgsql'
COST 100
VOLATILE PARALLEL UNSAFE
ROWS 1000
AS $BODY$
DECLARE
BEGIN
OPEN ref1 FOR SELECT * FROM dbo.tbl1 WHERE coid = param_coid;
RETURN NEXT ref1;
OPEN ref2 FOR SELECT * FROM dbo.tbl2 LIMIT 5;
RETURN NEXT ref2;
END;
$BODY$;
USE IN pgSQL Query:-
BEGIN;
SELECT football_players.show_cities_multiple(123456, 'Ref1', 'Ref2');
FETCH ALL IN "Ref1";
FETCH ALL IN "Ref2";
COMMIT;
SELECT football_players.show_cities_multiple(123456, 'Ref1', 'Ref2');
FETCH ALL IN "Ref1";
SELECT football_players.show_cities_multiple(123456, 'Ref1', 'Ref2');
FETCH ALL IN "Ref2";
first_table
和second_table
具有相同的布局,您也可以只使用SELECT * FROM first_table WHERE ...
UNION ALL
SELECT * FROM second_table WHERE ...
[编辑:感谢评论者(名字可能不是“null”:))指出UNION ALL
比UNION
更快。]
Yes.
Example:
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)
当然,您可以使用现有的表/视图或自定义类型作为返回类型。
以下是使用 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)
json
等文档类型来绕过此问题。我建议您提出一个新的问题,因为评论区不适合讨论此类问题。 - Erwin BrandstetterSELECT
语句一个不同的结果集”。这不是SQL本身的限制,而是Postgres的限制,对吗? - undefined