我使用
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.Can所述.我声明自己的游标名称,并使用此游标名称来操作返回的游标而不是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).
编辑:
另一种方法可以使用这样查询的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)