आप जो करने की कोशिश कर रहे हैं वह इस तरह काम कर सकता है:
अतिरिक्त जानकारी के साथ संपादित करें
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();
प्रमुख बिंदु:
- उत्पादों के बिना महीनों के लिए एक अन्यथा खाली पंक्ति को शामिल करने के लिए अंतिम संपादन।
- आपने "LEFT JOIN" लिखा था, लेकिन ऐसा नहीं है कि यह कैसे काम कर सकता है।
- ऐसा करने के कई तरीके हैं, लेकिन
RETURN QUERY
सबसे सुंदर है। - आपके फ़ंक्शन get_forecast_history() द्वारा उपयोग किए जाने वाले रिटर्न प्रकार का उपयोग करें।
- कॉलम नामों की तालिका-योग्यता (अंतिम संस्करण में अब लागू नहीं) द्वारा OUT पैरामीटर के साथ नामकरण के विरोध से बचें।
DATE '2008-01-01'
का उपयोग न करें , टाइमस्टैम्प का उपयोग करें जैसे मैंने किया था, इसे वैसे भी to_char() के लिए परिवर्तित किया जाना है। कम कास्टिंग, बेहतर प्रदर्शन करता है (ऐसा नहीं है कि यह इस मामले में ज्यादा मायने रखता है)।'2008-01-01 0:0'::timestamp
औरtimestamp '2008-01-01 0:0'
केवल दो सिंटैक्स वेरिएंट ऐसा ही कर रहे हैं।- पोस्टग्रेएसक्यूएल के पुराने संस्करणों के लिए भाषा plpgsql डिफॉल्ट द्वारा स्थापित नहीं है। आपको
CREATE LANGUAGE plpgsql;
. जारी करना पड़ सकता है एक बार आपके डेटाबेस में। मैन्युअल यहां देखें ।
यदि आप चाहें तो शायद आप अपने दो कार्यों को एक क्वेरी या फ़ंक्शन में सरल बना सकते हैं।