Tabelle zurückgeben

Hallo,

ich habe eine Funktion die DAten aus mehreren Tabellen einer Tabelle verdichtet. Das funktioniert soweit ja.
Diese Tabelle kann ich mir dann auch mit select * wunderbar anzeigen lassen.

Meine Frage, kann ich das direkt in die Funktion mit einbauen, dass die ergebnisse die mir das SELECT * auf diese Tabelle ausgibt direkt von der Funktion ausgegeben wird - also dass ich nur die funktion starten muss und die Ausgabe bekomme die ich bei SELECT Function; SELECT * hätte.

Ich hoffe ich konnte mich einigermaßen verständlich machen…

Ja.

Nennt sich ‘Set Returning Function’, kurz srf.

09:35 < akretschmer> ??srf
09:35 < rtfm_please> For information about srf
09:35 < rtfm_please> see http://www.postgresql.org/docs/current/static/xfunc-sql.html#XFUNC-SQL-TABLE-FUNCTIONS
09:35 < rtfm_please> or http://www.varlena.com/GeneralBits/26

Andreas

Hallo, irgendwie scheint das nicht zu funktionieren…
In dem Beispiel im Manual ist auch “LANGUAGE SQL;” angegeben, ich habe aber eine PL/pgSQL Funktion - kann das ein Problem sein ?

Also zum testen sieht meine Funktion so aus

CREATE OR REPLACE FUNCTION "test"."test_ausgabe" () RETURNS SETOF text AS
$body$
/* neues Funktions Körper  */
DECLARE

BEGIN

     SELECT * FROM test.testtabelle;

END
$body$
LANGUAGE 'plpgsql' VOLATILE CALLED ON NULL INPUT SECURITY INVOKER;

Fehlermeldung:

FEHLER:  SELECT query has no destination for result data
HINT:  If you want to discard the results, use PERFORM instead.
CONTEXT:  PL/pgSQL function "test_ausgabe" line 6 at SQL statement

Die Meldung ist ja eindeutig: du selektierst etwas ohne es zu verwenden.

test=# select * from kunde;
 id | status
----+--------
  1 |      1
  2 |      2
  3 |      3
(3 rows)

test=*# create or replace function get_all(OUT id int, OUT status int) returns setof record as $$ 
declare r record; 
begin 
for r in select * from kunde loop 
  id:=r.id;
  status:=r.status;
  return next;
end loop; 
end; 
$$language plpgsql;
CREATE FUNCTION
test=*# select * from get_all();
 id | status
----+--------
  1 |      1
  2 |      2
  3 |      3
(3 rows)

Andreas