Det du försöker kan fungera så här:
Redigera med ytterligare information
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:
SELECT * FROM f_products_per_month();
Huvudpunkter:
- Slutlig redigering för att inkludera en annars tom rad i månader utan produkter.
- Du skrev "LEFT JOIN", men det är inte så det kan fungera.
- Det finns flera sätt att göra detta, men RETURN QUERY är den mest eleganta.
- Använd samma returtyp som din funktion get_forecast_history() använder.
- Undvik namnkonflikter med OUT-parametrarna genom att tabellkvalificera kolumnnamnen (inte längre tillämpligt i den slutliga versionen).
- Använd inte
DATE '2008-01-01'
, använd en tidsstämpel som jag gjorde, den måste ändå konverteras till to_char(). Mindre casting, presterar bättre (inte för att det spelar så stor roll i det här fallet). '2008-01-01 0:0'::tidsstämpel
ochtidsstämpel '2008-01-01 0:0'
är bara två syntaxvarianter som gör samma sak.- För äldre versioner av PostgreSQL är språket plpgsql inte installerat som standard. Du kan behöva utfärda
CREATE LANGUAGE plpgsql;
en gång i din databas. Se handboken här .
Du kan förmodligen förenkla dina två funktioner till en fråga eller funktion om du vill.