1

我有一个用 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;

我希望能够通过单个选择命令来使用它,而不是(使用事务)的记录方式是:

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

我确信我以前能够做到这一点,但是我不记得我是如何做到的,或者找到它的文档。这可能吗?或者是否可以编写此函数,使其可以在不使用 refcursor 的情况下输出。

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

4

2 回答 2

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,您还可以使用更好的“返回查询”。

于 2009-09-30T18:08:30.963 回答
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
于 2011-06-09T11:32:20.973 回答