Функцията трябва да декларира тип на връщане. Един масив може да се основава само на добре известен тип елемент. Анонимен запис не е разрешен. Така че създайте съставен тип, който отговаря на вашите нужди (освен ако няма таблица или изглед, които вече дефинират типа ред).
CREATE TYPE my_type (
ts text
, alertlevel int
, time_passed interval
);
За целите на тестването можете също да създадете временна таблица, за да регистрирате съставен тип за продължителността на една сесия:
CREATE TEMP TABLE my_type ( ...)
(Временна таблица се изтрива в края на сесията, всяка функция, изградена върху типа, ще бъде повредена след това.)
Използвайте това като основен тип за масива. Можете да използвате проста 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;
Обаждане:
SELECT foo();
Проста алтернатива с text[]
Можете също да прехвърлите към text
/ text[]
. Губите имена на колони и информация за тип, но работи веднага:
CREATE OR REPLACE FUNCTION foo()
RETURNS text[] AS
$func$
SELECT array_agg(result::text) -- cast the record to text!
FROM ( ... ) result
...;
$func$
LANGUAGE sql;
Ако всъщност не се нуждаете от масив, можете да изтриете array_agg()
, връща отделни редове и декларира типа на връщане с RETURNS TABLE (...)
. Търсете SO за plpgsql
ще намерите много примери ..
Не забравяйте да извикате функция за връщане на набор с:
SELECT * FROM foo();