Uma função precisa declarar um tipo de retorno. Uma matriz só pode ser baseada em um tipo de elemento bem conhecido. Um registro anônimo não é permitido. Portanto, crie um tipo composto que atenda às suas necessidades (a menos que haja uma tabela ou visualização já definindo o tipo de linha).
CREATE TYPE my_type (
ts text
, alertlevel int
, time_passed interval
);
Para fins de teste, você também pode criar uma tabela temporária para registrar um tipo composto durante uma sessão:
CREATE TEMP TABLE my_type ( ...)
(Uma tabela temporária é descartada no final da sessão, qualquer função construída no tipo seria quebrada depois disso.)
Use isso como tipo base para a matriz. Você pode usar uma função SQL simples para o propósito:
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;
Ligar:
SELECT foo();
Alternativa simples com text[]
Você também pode transmitir para
text
/ text[]
. Você perde nomes de colunas e informações de tipo, mas funciona imediatamente: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 você realmente não precisa de um array, você pode descartar
array_agg()
, retorne linhas individuais e declare o tipo de retorno com RETURNS TABLE (...)
. Pesquise SO para o plpgsql
tag, você encontrará muitos exemplos .. Lembre-se de chamar uma função de retorno de conjunto com:
SELECT * FROM foo();