あなたがしようとしていることは次のように機能する可能性があります:
追加情報で編集
CREATE OR REPLACE FUNCTION f_products_per_month()
RETURNS SETOF fcholder AS
$BODY$
DECLARE
r fcholder;
BEGIN
FOR r.y, r.m IN
SELECT to_char(x, 'YYYY')::int4 -- AS y
,to_char(x, 'MM')::int4 -- AS m
FROM (SELECT '2008-01-01 0:0'::timestamp
+ (interval '1 month' * generate_series(0,57)) AS x) x
LOOP
RETURN QUERY
SELECT * -- use '*' in this case to stay in sync
FROM get_forecast_history(r.m, r.y);
IF NOT FOUND THEN
RETURN NEXT r;
END IF;
END LOOP;
END;
$BODY$
LANGUAGE plpgsql;
電話:
SELECT * FROM f_products_per_month();
主なポイント:
- 製品がない月の空の行を含めるための最終編集。
- 「LEFTJOIN」を作成しましたが、それが機能する方法ではありません。
- これを行うにはいくつかの方法がありますが、
RETURN QUERY
最もエレガントです。 - 関数get_forecast_history()が使用するのと同じリターンタイプを使用します。
- 列名をテーブル修飾することにより、OUTパラメータとの名前の競合を回避します(最終バージョンでは適用されなくなりました)。
-
DATE '2008-01-01'
は使用しないでください 、私が行ったようにタイムスタンプを使用します。とにかくto_char()に変換する必要があります。キャストが少なく、パフォーマンスが向上します(この場合はそれほど重要ではありません)。 -
'2008-01-01 0:0'::timestamp
およびtimestamp '2008-01-01 0:0'
同じことを行う2つの構文バリアントです。 - 古いバージョンのPostgreSQLの場合、言語plpgsqlはdefualtによってインストールされません。
CREATE LANGUAGE plpgsql;
を発行する必要がある場合があります データベースに一度。 こちらのマニュアル をご覧ください。 。
必要に応じて、2つの関数を1つのクエリまたは関数に単純化することもできます。