Ergebnis 1 bis 3 von 3

Thema: Dynamischer Zugriff auf RECORD

  1. #1
    stargaizer ist offline Neuer Benutzer
    Registriert seit
    08.04.2008
    Beiträge
    19

    Standard 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.
    Code:
    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
    Code:
    SELECT myfunc('strassen', 'xyzid');
    ausführt, soll in eigentlich die Funktion ein
    Code:
    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

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.472

    Standard

    Zitat Zitat von stargaizer Beitrag anzeigen
    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.
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    stargaizer ist offline Neuer Benutzer
    Registriert seit
    08.04.2008
    Beiträge
    19

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    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.

Ähnliche Themen

  1. RECORD als Tabelle
    Von Lara im Forum Migration
    Antworten: 1
    Letzter Beitrag: 15.11.2010, 11:23
  2. Zugriff auf postgres von dynamischer IP
    Von karl_ha im Forum Konfiguration
    Antworten: 7
    Letzter Beitrag: 27.01.2010, 14:15
  3. Dynamischer Join
    Von damike im Forum SQL
    Antworten: 2
    Letzter Beitrag: 08.11.2008, 10:09
  4. Dynamischer Return type?
    Von cevou im Forum PL/pgSQL
    Antworten: 6
    Letzter Beitrag: 25.08.2008, 15:39
  5. Dynamischer Zugriff auf new- bzw. old-Werte in Triggern
    Von meifra im Forum Trigger und Funktionen
    Antworten: 6
    Letzter Beitrag: 29.06.2006, 19:36

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum