postgresql存储过程返回多个表

时间:2013-02-21 01:55:57

标签: postgresql plpgsql

我有一个需要从多个表返回结果的函数。这可以在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文档但找不到任何指导。

非常感谢。

1 个答案:

答案 0 :(得分:5)

因为Pg(在编写本文时)不支持存储过程,只能从SQL调用,所以没有直接返回多个结果集的规定。

但是,您可以将函数定义为RETURNS SETOF refcursor。该函数可以创建多个临时表,为每个表打开一个游标并返回光标。

这有点笨拙,但有效。