sql >> Base de Datos >  >> RDS >> PostgreSQL

Tipo de retorno para función con array_agg()

Una función necesita declarar un tipo de retorno. Una matriz solo puede basarse en un tipo de elemento bien conocido. No se permite un registro anónimo. Por lo tanto, cree un tipo compuesto que se ajuste a sus necesidades (a menos que ya haya una tabla o una vista que defina el tipo de fila).

CREATE TYPE my_type (
  ts          text
, alertlevel  int
, time_passed interval
);

Con fines de prueba, también puede crear una tabla temporal para registrar un tipo compuesto durante la duración de una sesión:

CREATE TEMP TABLE my_type ( ...)

(Una tabla temporal se elimina al final de la sesión, cualquier función que se construya en el tipo se rompería después de eso).

Úselo como tipo base para la matriz. Puede usar una función SQL simple para este 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;

Llamar:

SELECT foo();

Alternativa simple con text[]

También puede transmitir a text / text[] . Pierde los nombres de las columnas y escribe la información, pero funciona de inmediato:

CREATE OR REPLACE FUNCTION foo()
  RETURNS text[] AS
$func$
SELECT array_agg(result::text)  -- cast the record to text!
FROM  ( ... ) result
...;
$func$
LANGUAGE sql;

Si en realidad no necesita una matriz, puede desechar array_agg() , devolver filas individuales y declarar el tipo de retorno con RETURNS TABLE (...) . Busque SO para el etiqueta, encontraras muchos ejemplos..

Recuerde llamar a una función de devolución de conjuntos con:

SELECT * FROM foo();