4 Stimmen

Wie ruft man die Postgres-Funktion auf, die SETOF Datensätze zurückgibt?

Ich habe die folgende Funktion geschrieben:

    -- Holt Statistiken für alle Märkte
CREATE OR REPLACE FUNCTION GetMarketStats (
)
RETURNS SETOF record
AS
$$
BEGIN
 SELECT 'R genehmigtes Angebot' AS Metric,
 SUM(CASE WHEN M.MarketName = 'A+' AND M.Term = 24 THEN LO.Amount ELSE 0 end) AS MarketAPlus24,
 SUM(CASE WHEN M.MarketName = 'A+' AND M.Term = 36 THEN LO.Amount ELSE 0 end) AS MarketAPlus36,
 SUM(CASE WHEN M.MarketName = 'A' AND M.Term = 24 THEN LO.Amount ELSE 0 end) AS MarketA24,
 SUM(CASE WHEN M.MarketName = 'A' AND M.Term = 36 THEN LO.Amount ELSE 0 end) AS MarketA36,
 SUM(CASE WHEN M.MarketName = 'B' AND M.Term = 24 THEN LO.Amount ELSE 0 end) AS MarketB24,
 SUM(CASE WHEN M.MarketName = 'B' AND M.Term = 36 THEN LO.Amount ELSE 0 end) AS MarketB36
FROM "Market" M
 INNER JOIN "Listing" L ON L.MarketID = M.MarketID
 INNER JOIN "ListingOffer" LO ON L.ListingID = LO.ListingID;
END
$$
LANGUAGE plpgsql;

Und wenn ich versuche, es so aufzurufen...

select * from GetMarketStats() AS (
   Metric VARCHAR(50),
   MarketAPlus24 INT,  
   MarketAPlus36 INT,
   MarketA24 INT,
   MarketA36 INT,
   MarketB24 INT,
   MarketB36 INT);

Bekomme ich einen Fehler:

ERROR:  Abfrage hat kein Ziel für Ergebnisdaten
HINWEIS:  Wenn Sie die Ergebnisse eines SELECT verwerfen möchten, verwenden Sie stattdessen PERFORM.
KONTEXT:  PL/pgSQL Funktion "getmarketstats" Zeile 2 in SQL-Anweisung

Ich verstehe diese Ausgabe nicht. Ich habe auch versucht, perform zu verwenden, aber ich dachte, man müsste das nur benutzen, wenn die Funktion nichts zurückgibt.

6voto

Frank Heikens Punkte 105033

Ihre Funktion macht keinen Sinn, sie gibt nichts zurück. Es scheint sich um eine ANSICHT zu handeln, warum erstellen Sie also keine Ansicht?

Bearbeiten: Sie haben die OUT-Parameter oder RETURN TABLE() mit den Parametern verwendet:

CREATE OR REPLACE FUNCTION my_func(OUT o_id INT, OUT o_bar TEXT) 
RETURNS SETOF RECORD AS
$$
BEGIN
    RETURN QUERY SELECT id, bar FROM foo;
END;
$$
LANGUAGE plpgsql;

SELECT  * FROM my_func();

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X