あなたはできた 行全体を複合型として返し、さらにいくつか追加します:
CREATE OR REPLACE FUNCTION f_rowplus()
RETURNS TABLE (rec demo, add_int int, add_txt text) AS
$func$
SELECT d, 5, 'baz'::text FROM demo d;
$func$ LANGUAGE sql;
ただし、単純な呼び出しを使用する場合:
SELECT * FROM f_rowplus();
テーブルdemo
から行を取得します 個別の複合タイプとして。電話する必要があります:
SELECT (rec).*, add_int, add_txt FROM f_rowplus();
すべての個人を取得するには 列。かっこが必要です。
Postgresはここでは少し一貫性がありません。次のコマンドで関数を作成する場合:
CREATE OR REPLACE FUNCTION f_row2()
RETURNS TABLE (rec demo) AS
...
次に、複合型demo
サイレントに個々の列に変換されます(分解されます)。元の複合タイプへのリンクは残りません。宣言された出力列rec
を参照することはできません まったく、それは分解されたタイプの列に置き換えられているので。この呼び出しにより、エラーメッセージが表示されます:
SELECT rec FROM f_row2();
ここでも同じ:
CREATE OR REPLACE FUNCTION f_row3(OUT rec demo)
RETURNS SETOF demo AS
...
ただし 、 anyを追加するとすぐに もっとOUT
列の場合、複合型は宣言されたとおりに保持され(分解されません)、次のことができます。
SELECT rec FROM f_rowplus();
最初の機能で。
SQLフィドルを作成しました バリアントのデモンストレーション。
脇
FROM
で複数の列を返す関数を使用する場合 リスト(テーブル関数として)およびSELECT
での分解 このようなリスト:
SELECT (rec).* FROM f_rowplus();
...関数は引き続き1回評価されます のみ-およびの呼び出し中 SELECT
で分解する このように直接リストします:
SELECT (f_rowplus()).*; -- also: different result
...すべての列に1回評価します リターンタイプで。詳細: