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