sql >> Database teknologi >  >> RDS >> PostgreSQL

PostgreSQL gener_series() med SQL-funktion som argumenter

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 og timestamp '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.




  1. Hvordan kan jeg få cx-oracle til at binde resultaterne af en forespørgsel til en ordbog i stedet for en tuple?

  2. Hibernate - Ingen egnet driver fundet til jdbc:mysql//*

  3. MySQL 8 Vælg Statement for at få 'Last_query_cost'

  4. En eksplicit værdi for identitetskolonnen i tabellen kan kun angives, når der bruges en kolonneliste, og IDENTITY_INSERT er PÅ SQL Server