PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Rückgabetyp für Funktion mit array_agg()

Eine Funktion muss einen Rückgabetyp deklarieren. Ein Array kann nur auf einem bekannten Elementtyp basieren. Eine anonyme Aufzeichnung ist nicht zulässig. Erstellen Sie also einen zusammengesetzten Typ, der Ihren Anforderungen entspricht (es sei denn, es gibt bereits eine Tabelle oder Ansicht, die den Zeilentyp definiert).

CREATE TYPE my_type (
  ts          text
, alertlevel  int
, time_passed interval
);

Zu Testzwecken können Sie auch eine temporäre Tabelle erstellen, um einen zusammengesetzten Typ für die Dauer einer Sitzung zu registrieren:

CREATE TEMP TABLE my_type ( ...)

(Eine temporäre Tabelle wird am Ende der Sitzung gelöscht, jede Funktion, die auf dem Typ aufbaut, würde danach beschädigt.)

Verwenden Sie dies als Basistyp für das Array. Dazu können Sie eine einfache SQL-Funktion verwenden:

CREATE OR REPLACE FUNCTION foo()
  RETURNS my_type[] AS
$func$
SELECT array_agg(result::my_type)  -- you must cast the row type!
FROM  (
   SELECT to_char("Timestamp", 'YYYY-MM-DD HH24:MI:SS')
        , "AlertLevel"
        , "Timestamp" - lag("Timestamp") OVER (ORDER BY "Timestamp")
   FROM   "Judgements"
   WHERE  "SampleID" = sampleid
   AND    "Timestamp" >= starttime
   AND    "Timestamp" <= stoptime
   ) result
WHERE "AlertLevel" > 0;
$func$
LANGUAGE sql;

Aufruf:

SELECT foo();

Einfache Alternative mit text[]

Sie können auch in text umwandeln / text[] . Sie verlieren Spaltennamen und geben Informationen ein, aber es funktioniert sofort:

CREATE OR REPLACE FUNCTION foo()
  RETURNS text[] AS
$func$
SELECT array_agg(result::text)  -- cast the record to text!
FROM  ( ... ) result
...;
$func$
LANGUAGE sql;

Wenn Sie eigentlich kein Array benötigen, können Sie array_agg() wegwerfen , einzelne Zeilen zurückgeben und den Rückgabetyp mit RETURNS TABLE (...) deklarieren . Suchen Sie SO nach Tag finden Sie viele Beispiele ..

Denken Sie daran, eine Set-Returning-Funktion aufzurufen mit:

SELECT * FROM foo();