PostgreSQL - mehrere Werte aus einer Funktion

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

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 Select blork(3); selektieren und bekommt dann auch die drei Werte zurueck.

source:shtest=# select blork(1);
blork
——-
3
2
1
(3 rows)

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;

Zu dem Return Next gibt es auch eine Abteilung im offiziellen Handbuch (PostgreSQL: Documentation: Manuals: Post greSQL 8.4: Control Structures).