+++
title = "PostgreSQL - mehrere Werte aus einer Funktion"
date = "2010-06-04T07:59:00+00:00"
author = "Gibheer"
draft = false
+++

Ich wurde gestern gefragt, wie man PL/PGSQL aus einer Funktion mehrere
Werte zurueckgeben kann. Da der Funktionsaufruf danach in PHP weiter
verarbeitet werden sollte, fielen Arrays schon mal raus.

Meine zweite Idee war, einfach eine dynamische Tabelle zurueck zu geben.

<source:sql>\
create or replace function blork(mult int) returns setof integer as
\$\$\
begin\
 return next mult \* 3;\
 return next mult \* 2;\
 return next mult \* 1;\
 return;\
end;\
\$\$ LANGUAGE ‘plpgsql’;\
</source>

Das wichtige ist, dass man SETOF benutzt und dort den Datentyp
definiert, welcher zurueckgegeben werden soll. Das kann integer sein,
String, aber auch ein row-set aus einer bestehenden Tabelle.

Man kann diese Tabelle dann mit <code>Select blork(3);</code>
selektieren und bekommt dann auch die drei Werte zurueck.

<source:sh>test=\# select blork(1);\
 blork\
——-\
 3\
 2\
 1\
(3 rows)\
</source>

Die Funktion laesst sich dann auch ganz normal in JOINs und sonstiges
einbauen, zum Beispiel

<source:sql>\
select \* from (\
 select fun from blork(3) as fun\
) as sub\_fun right join (\
 select gen from generate\_series(1, 15) as gen\
) as subgen on fun = gen;\
</source>

Zu dem Return Next gibt es auch eine Abteilung im offiziellen [Handbuch
(PostgreSQL: Documentation: Manuals: Post greSQL 8.4: Control
Structures)](http://www.postgresql.org/docs/8.4/static/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING).
