Hallo Leute,
ich habe hier ein kleines Problem und komme deswegen nicht weiter.
ich muss OHNE Spaltennamen (da Tabellen dynamisch sind) zu kennen, die Werte verbinden in einem String,Code:mydata RECORD; sql text; sql := '...'; FOR mydata IN EXECUTE(SELECT * FROM table) LOOP sql := sql || '...'; // hier das problem END LOOP;
ungefähr so:
Aber da ich die Spaltennamen nicht kenne, kann ich den RECORD nicht sinnvoll iterieren.Code:sql := mydata.spalte1 || ',' || mydata.spalte2, ....
Gibt es da eine Möglichkeit ?
Danke vorraus!
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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 ?
Bei Deiner Art zu quoten nicht verwunderlich.
Sowohl, als auch.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.
Ja.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 ?
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
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
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
(PROBLEM) hier brauche ich eine INSERT query mit den Daten aus oberem SELECTCode: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';
Ansatz wäre:
PS: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;
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)
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
Ok, verstehe... also im Grunde genommen ist klar.
Nur noch eine Frage zum Überlegen.
Wenn ich
oben in der FOR schleife ausgeben lasse bekomme ich folgende Ausgabe:Code:RAISE NOTICE '%', data;
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...
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen