値を返すための構文と、単一の行または値を返すための構文をSETOF
混在させています。
-関連する質問は-単一のレコード「r」をから返すにはどうすればよいですか
RETURNS TABLE
を使用して関数を宣言する場合RETURN NEXT
、行(またはスカラー値)を返すために本文で使用する必要があります。record
また、変数を使用する場合は、戻り値の型と一致する必要があります。さらに下のコード例を参照してください。
単一の値または行を返します
単一の行を返したいだけの場合は、未定義のタイプのレコードは必要ありません。@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;
あなたの質問はあなたが正確に何を必要としているかについてはっきりしていません。