Hallo,
ich habe das Problem, dass ich bei einer Funktion einen Tabellennamen und einen Spaltennamen übergeben bekomme. Nun werden in einem LOOP die Daten aus einem SELECT über eine RECORD Variable verarbeitet. Eigentlich kein Problem, wenn die Felder des RECORD’s fest definiert wären. Leider muß die Funktion so variabel sein, dass man eben den Tabellennamen und den Spaltennamen übergeben kann. Hier mal ein Stück Code um das zu verdeutlichen.
CREATE OR REPLACE FUNCTION myfunc(tablename character varying, gid_name character varying) RETURNS character varying
LANGUAGE plpgsql STRICT
AS $$
DECLARE
foo record;
bar integer;
BEGIN
FOR foo IN EXECUTE 'SELECT * FROM ' || quote_ident(tablename)
LOOP
bar := foo.gid_name;
EXECUTE 'SELECT blah.* FROM blah, ' || quote_ident(tablename) || ' WHERE blah.id = ' || bar;
END LOOP;
RETURN '';
END;
$$;
An der Stelle “bar := foo.gid_name;” versucht PG jetzt natürlich auf die Spalte “gid_name” vom “foo” RECORD zuzugreifen. Das geht schief, weil die nich da ist und ich ja in “bar” den Wert der durch “gid_name” benannten Spalte brauche.
Wenn man also ein
SELECT myfunc('strassen', 'xyzid');
ausführt, soll in eigentlich die Funktion ein
bar := foo.xyzid;
ausführen.
Bitte nicht weiter über den Sinn der SELECT’s nachdenken, das ist nur ein vereinfachtes Beispiel, da die Funktion etwas komplexer ist und ich eine sollche Ersetzung an mehreren Stellen brauche. Und das nicht nur mit einem Parameter.
Danke für eure Ideen und Vorschläge
stargaizer