Funkce musí deklarovat návratový typ. Pole může být založeno pouze na dobře známém typu prvku. Anonymní záznam není povolen. Vytvořte tedy složený typ, který vyhovuje vašim potřebám (pokud již neexistuje tabulka nebo pohled definující typ řádku).
CREATE TYPE my_type (
ts text
, alertlevel int
, time_passed interval
);
Pro účely testování můžete také vytvořit dočasnou tabulku pro registraci složeného typu po dobu trvání relace:
CREATE TEMP TABLE my_type ( ...)
(Dočasná tabulka je na konci relace zrušena, jakákoli funkce budovaná na typu by byla poté přerušena.)
Použijte jej jako základní typ pro pole. Pro tento účel můžete použít jednoduchou funkci SQL:
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;
Volejte:
SELECT foo();
Jednoduchá alternativa s text[]
Můžete také přenášet do text
/ text[]
. Ztratíte názvy sloupců a informace o typu, ale funguje to hned po vybalení:
CREATE OR REPLACE FUNCTION foo()
RETURNS text[] AS
$func$
SELECT array_agg(result::text) -- cast the record to text!
FROM ( ... ) result
...;
$func$
LANGUAGE sql;
Pokud pole ve skutečnosti nepotřebujete, můžete zrušit array_agg()
, vraťte jednotlivé řádky a deklarujte návratový typ pomocí RETURNS TABLE (...)
. Vyhledejte v SO plpgsql
naleznete mnoho příkladů ..
Nezapomeňte zavolat funkci vrácení sady pomocí:
SELECT * FROM foo();