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

时间:2019-05-13 13:03:50

标签: postgresql

我无法弄清楚如何使用PostgreSQL上的Refcursor变量的值进行抓取。

查看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,然后它只是给出了语法错误。)

1 个答案:

答案 0 :(得分:1)

要命名光标,只需为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;