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;

(トランザクションを使用して)文書化された方法とは対照的に、単一のselectコマンドでこれを使用できるようにしたいと思います。

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

私は以前にこれを行うことができたと確信していますが、私がそれをどのように行ったかを思い出せないか、それが文書化されているのを見つけることができません。これは可能ですか?または、リフレクターを使用せずに出力できるようにこの関数を作成することは可能ですか。

複数の行が返され、返される前に関数でデータチェックが行われることを期待しています。したがって、ストアドプロシージャを使用する必要があります。

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 を使用している場合は、さらに便利な "RETURN QUERY" も使用できます。

于 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 に答える