テーブルを返す plpgsql 関数が PostgreSQL 9.2 にあります。関数は、関数と同じ列を返すいくつかの SELECT を実行し、いくつかのチェックに応じて、それらの結果を返すか、例外を発生させます。これを行う唯一の方法は FOR ... LOOP を使用することですが、行を返す便利な方法がわかりません。
私はこのようなことをしたい:
CREATE OR REPLACE FUNCTION my_function()
RETURNS TABLE(column1 integer, column2 boolean, ...)
AS $BODY$
DECLARE
result_row RECORD;
BEGIN
FOR result_row IN (SELECT * FROM other_function_returning_same_columns()) LOOP
IF something_wrong_with(result_row) THEN
RAISE EXCEPTION 'Something went wrong';
END IF;
RETURN NEXT result_row;
END LOOP;
END
$BODY$ LANGUAGE plpgsql STABLE;
これは私にエラーを与えます:
エラー: RETURN NEXT は、OUT パラメータを持つ関数にパラメータを持つことはできません
関数が SETOF ではなく TABLE を返すことを除いて、私のコードはドキュメンテーションの例とよく似ているため、なぜ Postgres がここで不平を言っているのかわかりません。OUT パラメータはありません。
私は最終的にそれを使用して動作させることができました
RETURN QUERY SELECT result_row.column1, result_row.column2, ...;
しかし、常にすべての列をリストしなければならないのは見苦しく、維持するのが困難です。きっともっと良い方法があるはずです。