Funkcja musi zadeklarować zwracany typ. Tablica może być oparta tylko na dobrze znanym typie elementu. Anonimowy rekord jest niedozwolony. Stwórz więc typ złożony, który odpowiada Twoim potrzebom (chyba że istnieje tabela lub widok już definiujący typ wiersza).
CREATE TYPE my_type (
ts text
, alertlevel int
, time_passed interval
);
Do celów testowych możesz również utworzyć tabelę tymczasową, aby zarejestrować typ złożony na czas trwania sesji:
CREATE TEMP TABLE my_type ( ...)
(Tabela tymczasowa jest usuwana na koniec sesji, każda funkcja oparta na typie zostanie po tym zepsuta).
Użyj tego jako typu podstawowego dla tablicy. W tym celu możesz użyć prostej funkcji 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;
Zadzwoń:
SELECT foo();
Prosta alternatywa z text[]
Możesz także przesyłać do text
/ text[]
. Tracisz nazwy kolumn i informacje o typach, ale działa to po wyjęciu z pudełka:
CREATE OR REPLACE FUNCTION foo()
RETURNS text[] AS
$func$
SELECT array_agg(result::text) -- cast the record to text!
FROM ( ... ) result
...;
$func$
LANGUAGE sql;
Jeśli faktycznie nie potrzebujesz tablicy, możesz usunąć array_agg()
, zwróć poszczególne wiersze i zadeklaruj typ zwracany za pomocą RETURNS TABLE (...)
. Wyszukaj SO dla plpgsql
tag, znajdziesz wiele przykładów ..
Pamiętaj, aby wywołać funkcję zwracania zestawu za pomocą:
SELECT * FROM foo();