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).
|