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

Tipo restituito per la funzione con array_agg()

Una funzione deve dichiarare un tipo restituito. Un array può essere basato solo su un tipo di elemento ben noto. Non è consentito un record anonimo. Quindi crea un tipo composito adatto alle tue esigenze (a meno che non ci sia già una tabella o una vista che definisce il tipo di riga).

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

A scopo di test puoi anche creare una tabella temporanea per registrare un tipo composto per la durata di una sessione:

CREATE TEMP TABLE my_type ( ...)

(Una tabella temporanea viene eliminata alla fine della sessione, qualsiasi funzione costruita sul tipo verrebbe interrotta.)

Usalo come tipo di base per l'array. È possibile utilizzare una semplice funzione SQL per lo scopo:

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;

Chiama:

SELECT foo();

Semplice alternativa con text[]

Puoi anche trasmettere a text / text[] . Perdi i nomi delle colonne e digita le informazioni, ma funziona immediatamente:

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

Se in realtà non hai bisogno di un array, puoi eliminare array_agg() , restituire singole righe e dichiarare il tipo restituito con RETURNS TABLE (...) . Cerca in SO il tag, troverai molti esempi..

Ricordarsi di chiamare una funzione di restituzione di set con:

SELECT * FROM foo();