Wat u probeert te doen, zou als volgt kunnen werken:
Bewerken met aanvullende info
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;
Bel:
SELECT * FROM f_products_per_month();
Belangrijkste punten:
- Laatste bewerking om een anders lege rij op te nemen voor maanden zonder producten.
- Je hebt "LEFT JOIN" geschreven, maar zo kan het niet werken.
- Er zijn verschillende manieren om dit te doen, maar
RETURN QUERY
is de meest elegante. - Gebruik hetzelfde retourtype als uw functie get_forecast_history() gebruikt.
- Vermijd naamgevingsconflicten met de OUT-parameters door de kolomnamen te kwalificeren (niet meer van toepassing in de definitieve versie).
- Gebruik
DATE '2008-01-01'
niet , gebruik een tijdstempel zoals ik deed, het moet hoe dan ook worden geconverteerd naar to_char(). Minder casten, presteert beter (niet dat het in dit geval veel uitmaakt). '2008-01-01 0:0'::timestamp
entimestamp '2008-01-01 0:0'
zijn slechts twee syntaxisvarianten die hetzelfde doen.- Voor oudere versies van PostgreSQL is de taal plpgsql niet standaard geïnstalleerd. Mogelijk moet u
CREATE LANGUAGE plpgsql;
eenmaal in uw database. Zie de handleiding hier .
Je zou waarschijnlijk je twee functies kunnen vereenvoudigen tot één query of functie als je dat zou willen.