Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: RECORD durchlaufen

  1. #1
    Sergius ist offline Neuer Benutzer
    Registriert seit
    19.06.2011
    Beiträge
    16

    Standard RECORD durchlaufen

    Hallo Leute,

    ich habe hier ein kleines Problem und komme deswegen nicht weiter.

    Code:
    mydata RECORD;
    sql text;
    
    sql := '...';
    
    FOR mydata IN EXECUTE(SELECT * FROM table) LOOP
    
         sql := sql || '...'; // hier das problem
    
    END LOOP;
    ich muss OHNE Spaltennamen (da Tabellen dynamisch sind) zu kennen, die Werte verbinden in einem String,
    ungefähr so:

    Code:
    sql := mydata.spalte1 || ',' || mydata.spalte2, ....
    Aber da ich die Spaltennamen nicht kenne, kann ich den RECORD nicht sinnvoll iterieren.

    Gibt es da eine Möglichkeit ?

    Danke vorraus!

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

    Standard

    Zitat Zitat von Sergius Beitrag anzeigen
    Hallo Leute,

    ich habe hier ein kleines Problem und komme deswegen nicht weiter.

    Code:
    mydata RECORD;
    sql text;
    
    sql := '...';
    
    FOR mydata IN EXECUTE(SELECT * FROM table) LOOP
    
         sql := sql || '...'; // hier das problem
    
    END LOOP;
    ich muss OHNE Spaltennamen (da Tabellen dynamisch sind) zu kennen, die Werte verbinden in einem String,
    ungefähr so:

    Code:
    sql := mydata.spalte1 || ',' || mydata.spalte2, ....
    Aber da ich die Spaltennamen nicht kenne, kann ich den RECORD nicht sinnvoll iterieren.

    Gibt es da eine Möglichkeit ?

    Danke vorraus!
    1. select * in produktivem Code ist arg böse
    2. du kannst die Spaltennamen auch dynamisch ermitteln
    3. je nach verwendeter PL kennt die Sprache auch die Spaltennamen. In PERL ist das IIRC z.B. der Fall


    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
    Sergius ist offline Neuer Benutzer
    Registriert seit
    19.06.2011
    Beiträge
    16

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    2. du kannst die Spaltennamen auch dynamisch ermitteln
    Andreas
    Ich will keine Spaltennamen ermitteln, ich brauche nur die Werte von dem Record (ohne Spaltennamen zu kennen),
    geht das ?

    Zitat Zitat von akretschmer Beitrag anzeigen
    3. je nach verwendeter PL kennt die Sprache auch die Spaltennamen. In PERL ist das IIRC z.B. der Fall
    Andreas
    Habe vergessen zu sagen,
    der Code ist in 'plpgsql'

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

    Standard

    Zitat Zitat von Sergius Beitrag anzeigen
    Ich will keine Spaltennamen ermitteln, ich brauche nur die Werte von dem Record (ohne Spaltennamen zu kennen),
    geht das ?
    Kommt auf die PL an.

    Habe vergessen zu sagen,
    der Code ist in 'plpgsql'
    In der nicht.


    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

  5. #5
    Sergius ist offline Neuer Benutzer
    Registriert seit
    19.06.2011
    Beiträge
    16

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Kommt auf die PL an.

    In der nicht.

    Andreas
    Ich weiss jetzt nicht auf was sich deine Antwort bezieht.

    Auf das man in Plpgsql auf die Spaltennamen von dem Record nicht kommt,
    oder dass man Record ohne die zu wissen nicht durch iterieren kann.

    Da mich nur der zweite Teil interessiert.

    Angenommen ich habe ein RECORD mit Spaltenname:

    rec.a = 10;
    rec.b = 20;

    Heisst das, dass ich nicht einfach irgendwie über Indexe

    wie (Pseudocode)

    rec[0], rec[1]

    oder über

    foreach(value in rec)
    {
    }

    nicht auf die Werte komme ?

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

    Standard

    Zitat Zitat von Sergius Beitrag anzeigen
    Ich weiss jetzt nicht auf was sich deine Antwort bezieht.
    Bei Deiner Art zu quoten nicht verwunderlich.

    Auf das man in Plpgsql auf die Spaltennamen von dem Record nicht kommt,
    oder dass man Record ohne die zu wissen nicht durch iterieren kann.
    Sowohl, als auch.

    Da mich nur der zweite Teil interessiert.

    Angenommen ich habe ein RECORD mit Spaltenname:

    rec.a = 10;
    rec.b = 20;

    Heisst das, dass ich nicht einfach irgendwie über Indexe

    wie (Pseudocode)

    rec[0], rec[1]

    oder über

    foreach(value in rec)
    {
    }

    nicht auf die Werte komme ?
    Ja.

    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

  7. #7
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Du kannst in pl/pgSQL nicht die Spaltennamen durch iterieren, das sieht die Sprache leider immer noch nicht vor.
    Es gibt ein paar sehr krude Workarounds, aber die beinhalten ein paar weitere C-Module - und dann kann man auch gleich eine andere Sprache nehmen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  8. #8
    Sergius ist offline Neuer Benutzer
    Registriert seit
    19.06.2011
    Beiträge
    16

    Standard

    Wie würdet ihr dann folgendes realisieren ?

    Es gibt eine Tabelle (mit dynamischen Anzahl und Namen von Spalten).
    (Die Namen und Anzahl kann man aus den Metadaten der Datenbank auslesen)

    Man muss diese Tabelle auslesen, Datensätze gruppieren und diese Daten in andere dynamische Tabelle mit gleicher Struktur speichern.

    Auslesen und gruppieren ist einfach und funktioniert

    Code:
    DECLARE
        columns RECORD;
        sql_select text;
    
    BEGIN
    
        -- SQL Query erstellen: SELECT avg(...) AS ..., avg(...) AS ..., avg(...) AS ... FROM tabele GROP BY kundennummer;
        -- Beispiel: SELECT avg(bilanz) AS bilanz, avg(anzahl) AS anzahl, avg(punkte) AS punkte FROM tabele GROP BY kundennummer;
    
        sql_select := 'SELECT ';
    
        FOR columns IN SELECT column_name FROM informations_schema.columns WHERE table_name = tablename LOOP
            sql_select := sql_select || 'avg(' || columns.column_name || ') AS ' || columns.column_name ' ,';
        END LOOP;
    
        sql_select := sql_select || 'FROM table GROUP BY kundennummer';
    (PROBLEM) hier brauche ich eine INSERT query mit den Daten aus oberem SELECT

    Ansatz wäre:

    Code:
    DECLARE
        data RECORD;
    
    BEGIN
    
        -- SQL Query erstellen: INSERT INTO tabele (..., ..., ...) VALUES (..., ..., ...);
        -- Beispiel: INSERT INTO (bilanz, anzahl, punkte) VALUES (10, 20, 30);
    
        sql_insert := 'INSERT INTO tabele ';
    
        FOR data IN EXECUTE(sql_select) LOOP
    
            -- HIER PROBLEM (wie komme ich an die Werte der SELECT ? data."columns.column_name" geht ja leider nicht
    
        END LOOP;
    PS:
    Vorgehen wie
    INSERT INTO table VALUES data,
    also einfügen als komplettes RECORD geht nicht,
    da ich dazwischen noch einige Berechnungen machen muss.


    Danke im Voraus!
    Geändert von Sergius (15.09.2011 um 16:59 Uhr)

  9. #9
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.056

    Standard

    Nicht in pl/pgSQL ...
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  10. #10
    Sergius ist offline Neuer Benutzer
    Registriert seit
    19.06.2011
    Beiträge
    16

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Nicht in pl/pgSQL ...
    Ok, verstehe... also im Grunde genommen ist klar.

    Nur noch eine Frage zum Überlegen.

    Wenn ich

    Code:
    RAISE NOTICE '%', data;
    oben in der FOR schleife ausgeben lasse bekomme ich folgende Ausgabe:
    z.B. je nach Tabelle:
    (384,383.619995117188,1,4,1,1)

    Das heisst ich komme an die Werte von dem Record doch ?
    Ohne die Spalten zu kennen. Dann müsste man einfach die Klammer trimmen
    und dann nach Komma Split machen.

    Ist zwar riesen Hack und ich werde es so nicht machen. Aber nur als Überlegung...

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Dynamischer Zugriff auf RECORD
    Von stargaizer im Forum PL/pgSQL
    Antworten: 2
    Letzter Beitrag: 19.02.2011, 14:54
  2. RECORD als Tabelle
    Von Lara im Forum Migration
    Antworten: 1
    Letzter Beitrag: 15.11.2010, 11:23
  3. RECORD Konkatenieren
    Von Sigh im Forum PL/pgSQL
    Antworten: 4
    Letzter Beitrag: 30.10.2009, 23:05
  4. Frage id/record eines inserts
    Von traxanos im Forum PL/pgSQL
    Antworten: 3
    Letzter Beitrag: 17.06.2009, 10:50
  5. Weder IF ... THEN noch ELSE-Teil werden durchlaufen
    Von achilles_69 im Forum PL/pgSQL
    Antworten: 2
    Letzter Beitrag: 26.02.2007, 16:48

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