13

我正在使用 Postgresql 8.3 并具有以下简单函数,该函数将 a 返回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;

现在,我可以使用以下 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;

除了如 38.7.3.5 所述将游标名称显式声明为函数的输入参数。返回游标,我可以声明自己的游标名称并使用此游标名称来操作返回的游标,而不是 Postgresql 自动为我生成吗?

如果没有,是否有任何命令可以获取生成的游标名称?

4

2 回答 2

17

我不太确定从哪个版本的 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;

然后你可以像这样得到它:

BEGIN;
SELECT function_1();
FETCH 4   from  mycursor; 
COMMIT;

我觉得这种方法不那么麻烦。希望有帮助。

于 2012-09-18T18:54:57.547 回答
6

是的,使用:

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

结果:

SELECT function_1('myowncursorname');
   function_1
-----------------
 myowncursorname
(1 row)

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

编辑:

作为另一种方式,您可以使用pg_cursors带有此类查询的视图来获取生成的游标名称:

SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table';

例如:

BEGIN;
SELECT function_1();
SELECT name FROM pg_cursors WHERE statement LIKE 'SELECT * FROM some_table';
COMMIT;

结果:

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

        name
--------------------
 <unnamed portal 3>
(1 row)
于 2011-07-13T08:15:28.123 回答