PostgreSQl 函数返回多个动态结果集

Posted

技术标签:

【中文标题】PostgreSQl 函数返回多个动态结果集【英文标题】:PostgreSQl function return multiple dynamic result sets 【发布时间】:2015-11-03 08:32:45 【问题描述】:

我有一个旧的 MSSQL 过程需要移植到 PostgreSQL 函数。基本上,SQL 过程包含在 select 语句上的 CURSOR 中。对于每个游标实体,我有三个基于当前游标输出的选择语句。

FETCH NEXT FROM @cursor INTO @entityId
WHILE @@FETCH_STATUS = 0
BEGIN
SELECT * FROM table1 WHERE col1 = @entityId
SELECT * FROM table2 WHERE col2 = @entityId
SELECT * FROM table3 WHERE col3 = @entityId
END

SELECT 语句中的表具有不同的列。

我知道 PostgreSQL 使用refcursor 来返回多个结果集,但问题是是否可以在循环内打开并返回多个动态引用?

Npgsql .NET 数据提供程序用于处理结果。

循环内只有 1 个光标的 Postgres 测试代码:

CREATE OR REPLACE FUNCTION "TestCursor"(refcursor) 
RETURNS SETOF refcursor AS
$BODY$

DECLARE
    entity_id integer;  
BEGIN

    FOR entity_id IN SELECT "FolderID" from "Folder"
    LOOP
        OPEN $1 FOR SELECT * FROM "FolderInfo" WHERE "FolderID" = entity_id;
        RETURN NEXT $1;
        CLOSE $1;   
    END LOOP;
END;

$BODY$
LANGUAGE 'plpgsql' VOLATILE;

然后是测试代码:

BEGIN;
SELECT * FROM "TestCursor"('c');
FETCH ALL IN c;
COMMIT;

SELECT * FROM "TestCursor"('c'); 的输出类似于屏幕截图: 然后当我尝试获取数据时出现错误:ERROR: cursor "c" does not exist

【问题讨论】:

PostgreSQL 不支持存储过程,所以一次只能返回一个结果。 是可能的。检查这个post。 您能否详细说明从 3 个表格中选择的内容以及您希望它如何返回?例如,refcursor 不是结果集。如果三个表的列数据类型相同,可以UNION查询合二为一,然后返回那个结果集。 表格有不同的列,所以不能使用UNION。 不重复。在我发布这个问题之前,我看到了这篇文章。这里的问题是 refcursors 在 LOOP 内部是开闭的。当你执行这个函数时,你会得到一个游标列表,我不知道如何从中获取数据。 【参考方案1】:

您可以通过SETOF refcursor 模拟它。但这不是一个好主意。这种 T-SQL 模式在 Postgres 中没有得到很好的支持,应该尽可能禁止。 PostgreSQL 支持函数 - 函数可以返回标量、向量或关系。就这些。通常在 90% 的情况下可以重写 T-SQL 程序来清理 PostgreSQL 函数。

【讨论】:

以上是关于PostgreSQl 函数返回多个动态结果集的主要内容,如果未能解决你的问题,请参考以下文章

postgresql 函数返回结果集(zz)

PostgreSQL & JDBC“查询返回了多个结果集”

postgresql 中的函数调用不返回结果集

如何在 postgresql 中使用多个 RETURN QUERY 限制结果集

PostgreSQL函数如何返回数据集 [转]

PostgreSQL 将结果集返回为 JSON 数组?