我正在使用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;
现在,我可以使用以下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. Returning Cursors所述。我可以声明自己的游标名称并使用此游标名称来操纵返回的游标而不是Postgresql自动为我生成?如果没有,是否有任何命令可以获取生成的游标名称?
答案 0 :(得分: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;
然后你可以这样得到它:
BEGIN;
SELECT function_1();
FETCH 4 from mycursor;
COMMIT;
我发现这种方法不那么累赘。 希望有所帮助。
答案 1 :(得分:5)
是的,使用:
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)