PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Tipo de retorno para função com array_agg()


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 tag, você encontrará muitos exemplos ..

Lembre-se de chamar uma função de retorno de conjunto com:
SELECT * FROM foo();