PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Setof Record (virtuelle Tabelle) von der Funktion zurückgeben

(Dies wurde alles mit postgresql 8.3.7 getestet – haben Sie eine frühere Version? Schauen Sie sich nur Ihre Verwendung von „ALIAS FOR $1“ an)

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
$$;

Wenn Sie eine Datensatz- oder Zeilenvariable zurückzugeben haben (anstelle eines Abfrageergebnisses), verwenden Sie "RETURN NEXT" anstelle von "RETURN QUERY".

Um die Funktion aufzurufen, müssen Sie etwa Folgendes tun:

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

Sie müssen also definieren, was Sie vom Ausgabezeilenschema der Funktion in der Abfrage erwarten. Um dies zu vermeiden, können Sie Ausgabevariablen in der Funktionsdefinition angeben:

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
$$;

(Nicht ganz sicher, warum die zusätzlichen ::Text-Umwandlungen erforderlich sind ... '1' ist vielleicht standardmäßig ein Varchar?)