Frage wegen Rückgabetyp aus Funkion

CREATE OR REPLACE FUNCTION getnamen()
  RETURNS SETOF "varchar" AS
$BODY$
DECLARE
    namen RECORD;
BEGIN
    FOR namen IN EXECUTE 'SELECT vorname, nachname FROM name_table' LOOP
        RETURN NEXT namen.vorname, namen.nachname;
    END LOOP;
END;
$BODY$
  LANGUAGE 'plpgsql' VOLATILE;

der sinn ist, ich möchte eine tabelle zurückgegeben haben mit allen vor und nachnamen.

die obige funktion funzt nicht
ERROR: query "SELECT $1 , $2 " returned 2 columns

wenn ich RETURNS SETOF “varchar” zu RETURNS SETOF RECORD ändere und den return zu RETURN NEXT namen; dann:
ERROR: a column definition list is required for functions returning “record”

ich weiss hier nicht mehr weiter und brauch ein bischen hilfe.
der denkansatz reicht schon :wink:

vielen dank!

ps. die funktion, an der ich arbeite ist erheblich umfangreicher als der code dort oben. dieser code dient nur zur darstellung meines problems ^_^’

Hallo,

versuch doch mal die Daten in einer Variablen zusammenzusetzen und dann die Variable als varchar zurückzugeben. Schließlich sind Variable essentielle Bestandteile jeder Programmiersprache - somit wohl auch in plpgsql.

-!-!- Nur so eine Idee.

Rolf

is schlecht …
als variable zusammenlegen ist möglich, aber da die funktion sich rekursiv aufrufen soll weiss ich nich, wie ich in pl-sql diesen string wieder auseinander nehmen kann um dann seine einzelteile wieder weiterzuverwenden.

aber schon mal danke fürs ‘kopfmachen’ für eine idee! :slight_smile:

ps. um genau zu sein, ich will aus einer tabelle die nur ‘vorgänger’ und ‘nachfolger’ gespeichert hat alle kinder, kindeskinder usw. von einem bestimmten punkt auslesen und die dann nebst aus einer anderen tabelle den zugehörigen namen ausgeben … am besten als 2-spaltige tabelle…

Hallo Desmond

der Fehler liegt in Deiner Denkweise. RETURNS müssen immer einen “TYPE” oder einen SETOF “TYPE” zurück liefern. Die TYPE’s müssen vorher definiert sein. Wenn eine Tabelle selektiert wird, wird also immer die vollstängdige Tabellenzeile zurück gegeben. In Deinem Fall hast Du aber nur 2 Spalten aus der Tabelle ausgewählt. Hierfür ist erstmal kein TYPE definiert und in den TYPE varchar kann man keine 2 Spalten zurück geben. Daher die Fehlermeldung.

Da der SELECT wohl wesentlich umfangreicher ist, solltest Du Dir mal überlegen, ob ein VIEW (= vordefinierter SELECT) nicht sinnvoller ist. Die beschriebene Funktion macht ja auch nichts anderes.



mfg

fristo

vielleicht findet ihr ja eine bessere lösung oder besser überhaupt einen funzenden lösungsansatz:

mein problem (prinzipdarstellung):
Tabellen:

tab_a
WERT_ID | WERT
--------------
1       | wert1
2       | wert2
3       | ...
...


tab_nachvolger
WERT_ID | NACHFOLGER
--------------------
1       | 2
1       | 3
2       | 4
3       | 5
...


übersetzung
WERT_ID | DE   | EN   | FR | JP | ...
----------------------------------------
1       | Name | name | ...
2       | ...

ich möchte mir als kombination (wollte irgendwie als tabelle machen) von zb. WERT + DE alle nachfolger (kinder im baum) von zb. wert2 zurückgeben.

die funktion muss sich dafür auf jeden fall rekursiv aufrufen da postgre noch keine sql-funktionalität dafür implementiert hat (ala WITH-klausel (db2) oder connect by (oracle))

thanks!