Det, du prøver på, kunne fungere sådan her:
Rediger med yderligere oplysninger
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;
Ring til:
SELECT * FROM f_products_per_month();
Vigtige punkter:
- Endelig redigering for at inkludere en ellers tom række i måneder uden produkter.
- Du skrev "LEFT JOIN", men det er ikke sådan det kan fungere.
- Der er flere måder at gøre dette på, men >
RETURN QUERY
er den mest elegante. - Brug den samme returtype, som din funktion get_forecast_history() bruger.
- Undgå navngivningskonflikter med OUT-parametrene ved at tabelkvalificere kolonnenavnene (ikke længere relevant i den endelige version).
- Brug ikke
DATE '2008-01-01'
, brug et tidsstempel som jeg gjorde, det skal alligevel konverteres til to_char(). Mindre casting, yder bedre (ikke at det betyder meget i dette tilfælde). '2008-01-01 0:0'::timestamp
ogtimestamp '2008-01-01 0:0'
er kun to syntaksvarianter, der gør det samme.- For ældre versioner af PostgreSQL er sproget plpgsql ikke installeret som standard. Du skal muligvis udstede
CREATE LANGUAGE plpgsql;
én gang i din database. Se manualen her .
Du kunne sikkert forenkle dine to funktioner til én forespørgsel eller funktion, hvis du ville.