Frage Wie gibt man mehrere Zeilen in PostgreSQL mit RECORD zurück?


Ich versuche, eine Funktion zu erstellen, die eine SQL-Abfrage für mehrere Tabellen ausführt und die resultierende Tabelle aus der Abfrage ausgibt. Die resultierende Tabelle enthält mehrere Zeilen. Ich habe eine Menge Schwierigkeiten damit und ich habe Beiträge gelesen, die vorschlagen, zu verwenden RETURN NEXT aber ich konnte es auch nicht zur Arbeit bringen. Von dem, was ich verstehe RECORD kann verwendet werden, weil es die Werte der Daten übernimmt, die in es eingegeben werden. Hier ist mein Code soweit:

CREATE OR REPLACE FUNCTION
    most_docs()
RETURNS
    SETOF RECORD
AS $$
DECLARE
    result RECORD;
BEGIN
    CREATE VIEW MOSTDOC AS
    SELECT P.country, COUNT(P.country) AS cnt
    FROM Producer P, Movie M, ProducerMovie PM
    WHERE M.title = PM.title
    AND M.year = PM.year
    AND P.name = PM.name
    AND M.genre = 'Documentary'
    GROUP BY P.country;

    SELECT DISTINCT M.country INTO result
    FROM MOSTDOC M
    WHERE M.cnt = (SELECT MAX(M.cnt)
    FROM MOSTDOC M);

    RETURN result;
END;
$$ LANGUAGE plpgsql;

Jede Hilfe würde sehr geschätzt werden. Vielen Dank.

---------- Code in Bearbeitung

CREATE OR REPLACE FUNCTION
    most_docs()
RETURNS
    SETOF RECORD
AS $$
DECLARE
result RECORD
BEGIN
    CREATE VIEW MOSTDOC AS
    SELECT P.country, COUNT(P.country) AS cnt
    FROM Producer P, Movie M, ProducerMovie PM
    WHERE M.title = PM.title
    AND M.year = PM.year
    AND P.name = PM.name
    AND M.genre = 'Documentary'
    GROUP BY P.country;

    RETURN QUERY SELECT DISTINCT M.country
    FROM MOSTDOC M
    WHERE M.cnt = (SELECT MAX(M.cnt)
    FROM MOSTDOC M);
END;
$$ LANGUAGE plpgsql;

5
2017-08-11 23:59


Ursprung


Antworten:


Wenn ich Ihr Problem richtig verstehe, versuchen Sie so etwas zu tun (für Funktionen, die setof zurückgeben, verwende ich immer Typen)

CREATE TYPE frt_test_type AS
   (
    country character varying,
    cnt integer,
    country character varying); /* types may vary */

CREATE OR REPLACE FUNCTION
  RETURNS SETOF frt_test_type AS
$BODY$DECLARE r record;
BEGIN
  for r in     SELECT P.country, COUNT(P.country) AS cnt, 
FROM Producer P, Movie M, ProducerMovie PM
WHERE M.title = PM.title
AND M.year = PM.year
AND P.name = PM.name
AND M.genre = 'Documentary'
GROUP BY P.country;
  loop
      return next r; 
  end loop;
  return; 
END;$BODY$
  LANGUAGE 'plpgsql'

2
2017-08-12 08:24



Gemäß diese AntwortWas du brauchst ist:

RETURN QUERY SELECT DISTINCT......

0
2017-08-12 00:06