sql >> Database >  >> RDS >> PostgreSQL

Retourtype voor functie met array_agg()

Een functie moet een retourtype declareren. Een array kan alleen gebaseerd zijn op een bekend elementtype. Een anoniem record is niet toegestaan. Maak dus een samengesteld type dat aan uw behoeften voldoet (tenzij er een tabel of weergave is die het rijtype al definieert).

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

Voor testdoeleinden kunt u ook een tijdelijke tabel maken om een ​​samengesteld type te registreren voor de duur van een sessie:

CREATE TEMP TABLE my_type ( ...)

(Aan het einde van de sessie wordt een tijdelijke tabel verwijderd, elke functie die voortbouwt op het type wordt daarna verbroken.)

Gebruik dat als basistype voor de array. U kunt hiervoor een eenvoudige SQL-functie gebruiken:

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;

Bel:

SELECT foo();

Eenvoudig alternatief met text[]

Je kunt ook casten naar text / text[] . U verliest kolomnamen en typt informatie, maar het werkt direct:

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

Als je een array niet echt nodig hebt, kun je array_agg() scrap schrappen , retourneer individuele rijen en declareer het retourtype met RETURNS TABLE (...) . Zoek SO naar de tag, je zult veel voorbeelden vinden ..

Vergeet niet om een ​​set-retourfunctie aan te roepen met:

SELECT * FROM foo();



  1. Veroorzaakt door:org.postgresql.util.PSQLEException:FATAL:resterende verbindingssleuven zijn gereserveerd voor niet-replicatie-superuser-verbindingen

  2. Hoe al onze afbeeldingen van een VARBINARY(MAX)-veld in SQL Server 2008 naar het bestandssysteem te dumpen?

  3. SQL plakken in de MySQL-opdrachtregel

  4. JPA:Veel-op-veel-relatie - JsonMappingException:oneindige recursie