56 lines
1.5 KiB
Markdown
56 lines
1.5 KiB
Markdown
+++
|
||
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).
|