En funktion skal erklære en returtype. Et array kan kun baseres på en velkendt elementtype. En anonym registrering er ikke tilladt. Så opret en sammensat type, der passer til dine behov (medmindre der er en tabel eller visning, der allerede definerer rækketypen).
CREATE TYPE my_type (
ts text
, alertlevel int
, time_passed interval
);
Til testformål kan du også oprette en midlertidig tabel for at registrere en sammensat type for varigheden af en session:
CREATE TEMP TABLE my_type ( ...)
(En midlertidig tabel slettes i slutningen af sessionen, en hvilken som helst funktion, der bygger på typen, ville blive ødelagt efter det.)
Brug det som basistype for arrayet. Du kan bruge en simpel SQL-funktion til formålet:
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;
Ring til:
SELECT foo();
Simpelt alternativ med text[]
Du kan også caste til text
/ text[]
. Du mister kolonnenavne og typeoplysninger, men det fungerer ud af boksen:
CREATE OR REPLACE FUNCTION foo()
RETURNS text[] AS
$func$
SELECT array_agg(result::text) -- cast the record to text!
FROM ( ... ) result
...;
$func$
LANGUAGE sql;
Hvis du faktisk ikke har brug for et array, kan du slette array_agg()
, returner individuelle rækker og erklær returtypen med RETURNS TABLE (...)
. Søg SO efter plpgsql
tag, finder du mange eksempler ..
Husk at kalde en sæt-retur-funktion med:
SELECT * FROM foo();