SETOF
を返すための構文を混合しています 単一の行または値を返すための構文を持つ値。
-関連する質問は-単一のレコード「r」をから返すにはどうすればよいですか
RETURNS TABLE
を使用して関数を宣言する場合 、RETURN NEXT
を使用する必要があります 行(またはスカラー値)を返すために本文で。また、record
を使用する場合 一致する必要がある リターンタイプ。さらに下のコード例を参照してください。
単一の値または行を返す
1行だけを返したい場合は、必要ありません 未定義のタイプのレコードの場合。 @Kevinはすでに2つの方法を示しました。 OUT
を使用して簡略化されたバージョンを追加します パラメータ:
CREATE OR REPLACE FUNCTION my_func(OUT a integer, OUT b text)
AS
$func$
BEGIN
a := ...;
b := ...;
END
$func$ LANGUAGE plpgsql;
RETURN;
を追加する必要もありません 関数本体で、宣言されたOUT
の値 関数の最後にパラメータが自動的に返されます-NULL
割り当てられていないパラメータの場合。
そして、RETURNS RECORD
を宣言する必要はありません。 それはOUT
からすでに明らかだからです パラメータ。
行のセットを返します
実際に複数を返したい場合 行(0行または1行の可能性を含む)では、戻りタイプをRETURNS
として定義できます。 ...
-
SETOF some_type
、ここでsome_type
登録済みのスカラー型または複合型にすることができます。 -
TABLE (col1 type1, col2 type2)
-アドホックな行タイプの定義。 -
SETOF record
プラスOUT
列の名前とタイプを定義するパラメータ。
100%RETURNS TABLE
と同等 。 -
SETOF record
それ以上の定義なし。ただし、返される行は未定義です。 また、すべての呼び出しに列定義リストを含める必要があります(例を参照)。
レコードタイプに関するマニュアル:
レコード変数は行タイプの変数に似ていますが、事前定義された構造はありません。 SELECTまたはFORコマンドで割り当てられた行の実際の行構造を引き継ぎます。
もっとあります、読む マニュアル。
できます 定義されたタイプを割り当てずにレコード変数を使用すると、できます そのような未定義のレコードを返すことさえあります:
CREATE OR REPLACE FUNCTION my_func()
RETURNS SETOF record AS
$func$
DECLARE
r record;
BEGIN
r := (1::int, 'foo'::text); RETURN NEXT r; -- works with undefined record
r := (2::int, 'bar'::text); RETURN NEXT r;
END
$func$ LANGUAGE plpgsql;
電話:
SELECT * FROM my_func() AS x(a int, b text);
しかし、これは非常に扱いにくい 呼び出しごとに列定義リストを提供する必要があるためです。通常、よりエレガントなものに置き換えることができます:
- 関数の作成時にタイプがわかっている場合は、すぐに宣言してください(
RETURNS TABLE
または友達)。
CREATE OR REPLACE FUNCTION my_func()
RETURNS SETOF tbl_or_type AS
$func$
DECLARE
r tbl_or_type;
BEGIN
SELECT INTO tbl_or_type * FROM tbl WHERE id = 10;
RETURN NEXT r; -- type matches
SELECT INTO tbl_or_type * FROM tbl WHERE id = 12;
RETURN NEXT r;
-- Or simpler:
RETURN QUERY
SELECT * FROM tbl WHERE id = 14;
END
$func$ LANGUAGE plpgsql;
- 関数呼び出しの時点でタイプを知っている場合 、ポリモーフィック型を使用するより洗練された方法があります。
PL / pgSQL関数をリファクタリングして、さまざまなSELECTクエリの出力を返します
正確に何が必要かについての質問は不明確です。