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

时间:2015-11-03 08:32:45

标签: postgresql plpgsql postgresql-9.4

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

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来返回多个结果集,但问题是是否可以在循环内打开并返回多个动态refcursors?

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

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');输出与屏幕截图类似:enter image description here 然后,当我尝试获取数据时,我收到错误:ERROR: cursor "c" does not exist

1 个答案:

答案 0 :(得分:0)

您可以通过SETOF refcursor模仿它。但这不是一个好主意。 Postgres不支持这种T-SQL模式,应尽可能禁止。 PostgreSQL支持函数 - 函数可以返回标量,向量或关系。就这些。通常90%可以重写T-SQL过程来清理PostgreSQL函数。