Dynamischer Zugriff auf RECORD

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

Das geht so nicht in plpgsql. Must halt plperl oder sowas verwenden. Du kannst Dir aber mal Pavel Stehule’s blog: Iteration over record in PL/pgSQL anschauen.

Andreas

Dank dir Andreas, zumindest weiß ich jetzt, dass ich nicht weiter mit der Syntax rumexperimentieren muß. Ich hab jetzt noch ne andere Möglichkeit gefunden, die zwar nicht so elegant und etwas aufwändiger ist, aber zumindest komplett in plpgsl und ohne Erweiterungen.