我无法弄清楚如何使用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
,然后它只是给出了语法错误。)
答案 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;