sql >> Databasteknik >  >> RDS >> PostgreSQL

Returnera postuppsättning (virtuell tabell) från funktion

(Allt det här är testat med postgresql 8.3.7 - har du en tidigare version? tittar bara på din användning av "ALIAS FÖR $1")

CREATE OR REPLACE FUNCTION storeopeninghours_tostring(numeric)
 RETURNS SETOF RECORD AS $$
DECLARE
 open_id ALIAS FOR $1;
 result RECORD;
BEGIN
 RETURN QUERY SELECT '1', '2', '3';
 RETURN QUERY SELECT '3', '4', '5';
 RETURN QUERY SELECT '3', '4', '5';
END
$$;

Om du har en post eller radvariabel att returnera (istället för ett frågeresultat), använd "RETURN NEXT" istället för "RETURN QUERY".

För att anropa funktionen måste du göra något i stil med:

select * from storeopeninghours_tostring(1) f(a text, b text, c text);

Så du måste definiera vad du förväntar dig att utdataradschemat för funktionen ska finnas i frågan. För att undvika det kan du ange utdatavariabler i funktionsdefinitionen:

CREATE OR REPLACE FUNCTION storeopeninghours_tostring(open_id numeric, a OUT text, b OUT text, c OUT text)
 RETURNS SETOF RECORD LANGUAGE 'plpgsql' STABLE STRICT AS $$
BEGIN
 RETURN QUERY SELECT '1'::text, '2'::text, '3'::text;
 RETURN QUERY SELECT '3'::text, '4'::text, '5'::text;
 RETURN QUERY SELECT '3'::text, '4'::text, '5'::text;
END
$$;

(inte helt säker på varför de extra ::textcasterna krävs... '1' är en varchar som standard kanske?)



  1. Concat det andra kolumnvärdet om det första kolumnvärdet är detsamma

  2. SQL Server 2016:Skapa en databas

  3. Fullständig återställning av ett MySQL- eller MariaDB Galera-kluster från säkerhetskopiering

  4. skicka LIMIT som parametrar till MySQL sproc