gpt4 book ai didi

postgresql - 如何使用 Refcursor 变量的值进行 FETCH

转载 作者:行者123 更新时间:2023-11-29 13:10:05 28 4
gpt4 key购买 nike

我不知道如何在 PostgreSQL 上使用 Refcursor 变量的值来获取 FETCH。

查看the reffunc2() example from here ,具体如下:

CREATE FUNCTION reffunc2() RETURNS refcursor AS '
DECLARE
ref refcursor;
BEGIN
OPEN ref FOR SELECT col FROM test;
RETURN ref;
END;
' LANGUAGE plpgsql;
BEGIN;
SELECT reffunc2();
FETCH ALL IN "<unnamed cursor 1>";
COMMIT;

这有效,但最终的 FETCH似乎需要事先知道游标的名称,然后对其进行硬编码!但是,根据我自己的实验,这个名称会有所不同,通常类似于 "<unnamed portal 5>"。 (数量不同)。

我希望能够将示例的结尾更改为:

DO $$
DECLARE
foo refcursor;
BEGIN
SELECT reffunc2() INTO foo;
FETCH ALL IN foo;
END $$;

这样我就可以按名称进行选择,以响应从 reffunc2 传回的实际游标名称.但是FETCH ALL IN foo

ERROR:  syntax error at or near ";"
LINE 6: FETCH ALL IN foo;
^
********** Error **********

ERROR: syntax error at or near ";"
SQL state: 42601
Character: 85

我找不到任何方法让它工作。

编辑:

我只是尝试了这个(尽我所能,将结果转换为 TEXT 的建议):

DO $$
DECLARE
foo text;
BEGIN
SELECT CAST(reffunc2() AS text) INTO foo;
FETCH ALL IN foo;
END $$;

但现在我明白了

ERROR:  variable "foo" must be of type cursor or refcursor
LINE 6: FETCH ALL IN foo;
^
********** Error **********

ERROR: variable "foo" must be of type cursor or refcursor
SQL state: 42804
Character: 91

相反! (显然这一切都很好,除了在我以前的版本中变量 一个 refcursor ,然后它只是给出了一个语法错误。)

最佳答案

要命名游标,只需将一个字符串分配给 refcursor 变量:

DECLARE
ref refcursor := ''willi'';

然后门户将具有该名称。

在打开光标之前分配名称很重要。

如果您不想分配名称,只需将函数结果转换为 text,这将为您提供游标名称。

如何使用FETCH取决于调用它的环境:

  • 如果你从 SQL 中调用它,你必须这样做:

    FETCH ALL FROM willi;

    您必须使用函数的结果构造 SQL 语句,并将其转换为 text

  • 如果您从 PL/pgSQL 调用它,您可以在 FETCH 语句中使用一个变量,但您必须为结果提供一个目的地:

    DECLARE
    r refcursor;
    x text; -- use the correct type
    BEGIN
    r := reffunc2();
    FETCH NEXT FROM r INTO x;
    END;

关于postgresql - 如何使用 Refcursor 变量的值进行 FETCH,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56112958/

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