我有一个需要从多个表返回结果的函数。这可以在Postgresql中实现吗(9.1现在,计划很快迁移到9.2)?如果是这样,怎么做。
例如
create or replace function f1()
returns ???
as $body$ begin
return query select x.*
from users x;
return query select x.*
from user_preferences x join users y using(user_id) ; -- more where clauses
return query select x.*
from user_permissions x join users y using(user_id) ; -- more clauses
end; $body$ language 'plpgsql';
我考虑的替代方案是:(a)做一个用户和user_preferences(等)的笛卡尔积,但这将导致一个巨大的结果表和一个真正复杂的代码。 (b)首先对用户进行选择,然后迭代用户列表并根据其属性进行额外的迭代,但这将导致太多的数据库调用。而且,为什么我要编写SQL非常擅长的代码?
是否有一种简洁的方法可以从pg函数中获取多个结果集?我搜索了postgresql文档但找不到任何指导。
非常感谢。
答案 0 :(得分:5)
因为Pg(在编写本文时)不支持存储过程,只能从SQL调用,所以没有直接返回多个结果集的规定。
但是,您可以将函数定义为RETURNS SETOF refcursor
。该函数可以创建多个临时表,为每个表打开一个游标并返回光标。
这有点笨拙,但有效。