gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 13:55:14 25 4
gpt4 key购买 nike

我有一个旧的 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 来返回多个结果集,但问题是是否可以在循环内打开和返回多个动态 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'); 输出类似于屏幕截图:enter image description here然后当我尝试获取数据时出现错误:ERROR: cursor "c"does not exist

最佳答案

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

关于PostgreSQl 函数返回多个动态结果集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33494520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com