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
.
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 :)
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)
归档时间: |
|
查看次数: |
27153 次 |
最近记录: |