我有一个旧的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 test code with only 1 cursor inside loop:
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
1 回答
您可以通过
SETOF refcursor
模拟它 . 但这不是一个好主意 . Postgres不支持这种T-SQL模式,应尽可能禁止 . PostgreSQL支持函数 - 函数可以返回标量,向量或关系 . 就这些 . 通常在90%可以重写T-SQL过程来清理PostgreSQL函数 .