pl / pgsql中的Refcursor

时间:2009-09-30 18:01:51

标签: sql postgresql plpgsql

我有一个用pl / pgsql编写的函数,其工作方式与下面描述的相同:

CREATE FUNCTION reffunc(text) RETURNS refcursor AS '
BEGIN
    OPEN $1 FOR SELECT col FROM test WHERE c1=$1;
    RETURN $1;
END;
' LANGUAGE plpgsql;

我希望能够在单个select命令中使用它,而不是使用(使用事务)的文档化方式:

BEGIN;
SELECT reffunc('funccursor');
FETCH ALL IN "<unnamed cursor 1>";
COMMIT;

我确信我以前能够做到这一点,但是我不记得我是怎么做到的,或者发现它有记录。这可能吗?或者是否可以以不使用refcursor的方式输出它来编写此函数。

我希望返回多行,并在返回之前在函数中完成一些数据检查。因此需要使用存储过程。

2 个答案:

答案 0 :(得分:3)

当然可以在没有光标的情况下返回。

示例:

CREATE FUNCTION reffunc(in_c1 text) RETURNS setof test AS '
DECLARE
    temprec test;
BEGIN
    FOR temprec in SELECT col FROM test WHERE c1 = in_c1 LOOP
        return next temprec;
    END LOOP;
    RETURN;
END;
' LANGUAGE plpgsql;
select * from reffunc('funccursor');

如果你使用的是8.4,你也可以使用“返回查询”,这甚至更好。

答案 1 :(得分:1)

create or replace function reffunc(in_c1 text)
returns setof refcursor as
$body$
declare
       temprec refcursor;
/*
    MODULE NAME         DEVELOPER NAME      CREATED DATE    MODIFIED DATE 
                        MOHAMMED SHAKIR        9-6-2011 
*/
Begin
   open temprec for
           select col from test where c1 = in_c1;
RETURN NEXT REF1;
end;
$body$

LANGUAGE 'plpgsql' VOLATILE