一般に、提供されている単純な構文@Danielを使用して、よく知られている行型(別名、レコード型、複合型、複合型)を拡張できます。
SELECT i.name, (compute_prices(i.id, current_date)).*
FROM items i
WHERE i.type = 404;
しかし、あなたの説明が正確であれば...
Compute_prices spは、一連のレコードを返します。
...匿名のレコードを扱っています。Postgresは匿名レコードを拡張する方法を知らず、絶望の中で例外をスローします。
ERROR: a column definition list is required for functions returning "record"
PostgreSQL 9.3
Postgres9.3にはその解決策があります。、コメントで@a_horseがLATERAL
述べているように:
SELECT i.name, sp.*
FROM items i
LEFT JOIN LATERAL compute_prices(i.id,current_date) AS sp (
price numeric(15,2)
,discount numeric(5,2)
,taxes numeric(5,2)
) ON TRUE
WHERE i.type = 404;
マニュアルの詳細。
PostgreSQL9.2以前
物事は毛むくじゃらになります。回避策は次のとおりです。匿名レコードをよく知られたタイプに変換するラッパー関数を記述します。
CREATE OR REPLACE FUNCTION compute_prices_wrapper(int, date)
RETURNS TABLE (
price numeric(15,2)
,discount numeric(5,2)
,taxes numeric(5,2)
) AS
$func$
SELECT * FROM compute_prices($1, $2)
AS t(price numeric(15,2)
,discount numeric(5,2)
,taxes numeric(5,2));
$func$ LANGUAGE sql;
次に、@ Danielによる単純なソリューションを使用して、ラッパー関数をドロップするだけです。
SELECT i.name, (compute_prices_wrapper(i.id, current_date)).*
FROM items i
WHERE i.type = 404;
PostgreSQL8.3以前
PostgreSQL 8.3はEOLに到達したばかりで、現在(2013年2月)サポートされていません。
したがって、可能であればアップグレードすることをお勧めします。しかし、できない場合:
CREATE OR REPLACE FUNCTION compute_prices_wrapper(int, date
,OUT price numeric(15,2)
,OUT discount numeric(5,2)
,OUT taxes numeric(5,2))
RETURNS SETOF record AS
$func$
SELECT * FROM compute_prices($1, $2)
AS t(price numeric(15,2)
,discount numeric(5,2)
,taxes numeric(5,2));
$func$ LANGUAGE sql;
それ以降のバージョンでも動作します。
適切な解決策は、最初compute_prices()
によく知られた型を返すように関数を修正することです。返される関数SETOF record
は通常、PITAです。私は5メートルのポールでそれらを突くだけです。