1

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

非常感谢。

4

1 回答 1

5

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

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

这有点笨拙,但很有效。

于 2013-02-21T04:04:47.047 回答