原文来自http://hi.baidu.com/caodeliliang/item/cf3ff41041f74cf09d778a89,本文仅供自己学习使用,如有侵权,请联系我删除,邮箱adeng1943@126.com
CREATE OR REPLACE FUNCTION proc_faroundmap(streetid integer,pageno integer,pagesize integer)
RETURNS refcursor AS
$BODY$
declare
foodcur refcursor;
begin
open foodcur for
SELECT public_id,public_name,public_streetid FROM tbl_public where public_id in (
SELECT faround_compid FROM tbl_faround where faround_streetid=streetid and faround_type=2)
;
return foodcur;
end;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;
我在使用 select proc_faroundmap();后,返回"<unnamed portal 1>",请问是什么情况,该如何解决??
PL/pgsql 函数可以向调用者返回游标。 这个功能用于从函数里返回多行或多列。要想这么做的时候, 该函数打开游标并且把该游标的名字返回给调用者。 调用者然后从游标里FETCH行。 游标可以由调用者关闭,或者是在事务结束的时候自动关闭。
函数返回的游标名可以由调用者声明或者自动生成。 要声明一个信使的名字,只要再打开游标之前,给 refcursor 变量赋予一个字串就可以了。 refcursor 变量的字串值将被 OPEN 当作下层的信使的名字使用。 不过,如果 refcursor 变量是空,那么 OPEN 将自动生成一个和现有信使不冲突的名字, 然后将它赋予 refcursor 变量。
注意: 一个绑定的游标变量其名字初始化为对应的字串值,因此信使的名字和游标变量名同名, 除非程序员再打开游标之前通过赋值覆盖了这个名字。但是一个未绑定的游标变量初始化的时候缺省是空, 因此它会收到一个自动生成的唯一的名字,除非被覆盖。
下面的例子显示了一个调用者声明游标名字的方法:
CREATE TABLE test (col text);
INSERT INTO test VALUES ('123');
CREATE FUNCTION reffunc(refcursor) RETURNS refcursor AS '
BEGIN
OPEN $1 FOR SELECT col FROM test;
RETURN $1;
END;
' LANGUAGE plpgsql;
BEGIN;
SELECT reffunc('funccursor');
FETCH ALL IN funccursor;
COMMIT;
下面的例子使用了自动生成的游标名:
CREATE FUNCTION reffunc2() RETURNS refcursor AS '
DECLARE
ref refcursor;
OPEN ref FOR SELECT col FROM test;
RETURN ref;
SELECT reffunc2();
reffunc2
--------------------
<unnamed cursor 1>
(1 row)
FETCH ALL IN "<unnamed cursor 1>";
下面的例子显示了从一个函数里返回多个游标的方法:
CREATE FUNCTION myfunc(refcursor,refcursor) RETURNS SETOF refcursor AS $$
OPEN $1 FOR SELECT * FROM table_1;
RETURN NEXT $1;
OPEN $2 FOR SELECT * FROM table_2;
RETURN NEXT $2;
RETURN;
$$ LANGUAGE plpgsql;
-- 需要在事务里使用游标。
SELECT * FROM myfunc('a','b');
FETCH ALL FROM a;
FETCH ALL FROM b;
COMMIT; 原文链接:https://www.f2er.com/postgresql/196028.html