调用返回refcursor的函数

Ken*_*han 11 sql postgresql plpgsql cursor ref-cursor

我正在使用Postgresql 8.3并具有以下简单函数,它将返回refcursor 给客户端

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$
DECLARE
        ref_cursor REFCURSOR;
BEGIN
        OPEN ref_cursor FOR SELECT * FROM some_table;
        RETURN (ref_cursor);    
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

现在,我可以使用以下SQL命令来调用此函数并操纵返回的游标,但游标名称由PostgreSQL自动生成

BEGIN;
SELECT function_1();  --It will output the generated cursor name , for example , "<unnamed portal 11>" ;
FETCH 4   from  "<unnamed portal 11>"; 
COMMIT;
Run Code Online (Sandbox Code Playgroud)

此外,明确声明游标名称作为函数的输入参数,如 38.7.3.5所述.返回游标.可以声明我自己的游标名称并使用此游标名称来操作返回的游标而不是Postgresql自动为我生成?如果没有,是否有任何命令可以获取生成的游标名称?

Voi*_*ain 16

我不太确定Postgre的版本是否可用(在8.4中它是有效的)但我发现在你声明它时最容易定义游标名称,如下所示:

CREATE OR REPLACE FUNCTION function_1() RETURNS refcursor AS $$
DECLARE
        ref_cursor REFCURSOR := 'mycursor';
BEGIN
        OPEN ref_cursor FOR SELECT * FROM some_table;
        RETURN (ref_cursor);    
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

然后你可以这样得到它:

BEGIN;
SELECT function_1();
FETCH 4   from  mycursor; 
COMMIT;
Run Code Online (Sandbox Code Playgroud)

我发现这种方法不那么累赘.希望有所帮助.

  • 谢谢你的解决方案.它也可以在8.3.12中找到 (2认同)

Grz*_*ski 5

是的,使用:

CREATE OR REPLACE FUNCTION function_1(refcursor) RETURNS refcursor AS $$
BEGIN
        OPEN $1 FOR SELECT * FROM some_table;
        RETURN $1;    
END;
$$ LANGUAGE plpgsql;
Run Code Online (Sandbox Code Playgroud)

结果:

SELECT function_1('myowncursorname');
   function_1
-----------------
 myowncursorname
(1 row)
Run Code Online (Sandbox Code Playgroud)

看起来自动生成的名称是<unnamed portal n>,其中n是自然数(从1开始)。

编辑:

作为另一种方式,您可以将pg_cursorsview与此类查询结合使用以获取生成的游标名称:

SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table';
Run Code Online (Sandbox Code Playgroud)

例如:

BEGIN;
SELECT function_1();
SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table';
COMMIT;
Run Code Online (Sandbox Code Playgroud)

结果:

     function_1
--------------------
 <unnamed portal 3>
(1 row)

        name
--------------------
 <unnamed portal 3>
(1 row)
Run Code Online (Sandbox Code Playgroud)