我正在使用Postgresql 8.3,并具有以下简单功能,该功能会将a返回refcursor 给客户端
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吗?如果不是,是否有任何命令可以获取生成的游标名称?
是的,使用:
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开始)。
<unnamed portal n>
n
编辑:
作为另一种方式,您可以将pg_cursorsview与此类查询结合使用以获取生成的游标名称:
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)