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 plpgsql
tag, troverai molti esempi..
Ricordarsi di chiamare una funzione di restituzione di set con:
SELECT * FROM foo();