Was liefert denn besagte Funktion konkret für einen Typ zurück?
Hallo,
gibt es einen Datentyp, in dem ich die Ergebnismenge einer Funktion zwischenspeichern kann ?
Hintergrund:
Ich habe eine dreifach geschachtelte FOR-Schleife die jeweils durch die Ergebnismenge einer Funktion(!) iteriert.
Die äußerste FOR-Schleife ist nicht das Problem, aber die inneren FOR-Schleifen müssen bei jedem neuen Durchgang ihre Funktion neu aufrufen, was doch reichlich bremst.
Da die Ergebnismenge nicht einer Tabelle sondern einer Funktion entstammt, scheidet wohl %ROWTYPE als Datentyp aus.
Unter INFORMIX sieht die Lösung so aus:
--> hier wird ein sog. SET von LVARCHAR's übergeben.Code:DEFINE varName SET( LVARCHAR NOT NULL );
Viele Grüße,
Andreas
Was liefert denn besagte Funktion konkret für einen Typ zurück?
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
Hallo,
die 3 Funktionen liefern jeweils eine Spalte vom Datentyp VARCHAR zurück.
Code:CREATE OR REPLACE FUNCTION postgres.hmgetmatchkeys(...parameter...) RETURNS SETOF character varying AS 'LibHLAmatch.so', 'hmGetMatchKeys' LANGUAGE 'c' VOLATILE;
Und was hindert dich jetzt daran, im DECLARE Bereich eine VARCHAR Variable anzulegen und diese als Zwischenspeicher zu nutzen?
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
Ich habe folgendes Probiert:
Leider funktioniert das aber so nicht, gibt immer einen 'Syntax Error at or near "select" 'Code:DECLARE ... cur_a VARCHAR(4); keys_a VARCHAR NOT NULL; ... BEGIN ... keys_a := SELECT hmGetMatchKeys( ... Parameter ... ); ... FOR cur_a IN keys_a LOOP ...
Wenn ich statt der Variablen das Select-Statement in der FOR-Schleife verwende funktioniert alles ... aber dann wird halt jedes mal die Funktion abgearbeitet.
Ich weiss zwar immer noch nicht, von welcher FOR Schleife du genau sprichst, aber du solltest dir diesen Punkt der Dokumentation mal genauer durchlesen:
37.6.3 Executing a Query with a Single-Row Result
PostgreSQL: Documentation: Manuals: PostgreSQL 8.2: Basic Statements
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
Das Problem mit der Variablen scheint gelöst zu sein.
Jetzt kämpfe ich noch mit den besagten FOR-Schleifen, deren 'Zähler' vom Typ VarChar(4) durch die Variablen mit den Ergebnismengen ( eine Spalte mit entspr. VarChar-Werten) iterieren soll.Code:keys_a := hmGetMatchKeys( ... );
Hier scheint irgendwas mit der Syntax nicht zu stimmen, aber die Fehlermeldung von PGAdminIII hilft da auch nicht wirklich weiterCode:FOR cur_a IN keys_a LOOP FOR cur_b IN keys_b LOOP FOR cur_dr IN keys_dr LOOP ... END LOOP; END LOOP; END LOOP;
(Syntax Error at or near $1, LINE 1) :-(
Problem gelöst ... war ein syntaktischer Fehler:
Es fehlte lediglich ein SELECT for der Variablen, welche die Ergebnismenge enthielt ...Code:FOR cur_a IN SELECT keys_a LOOP
Vielen, vielen Dank !!!
akretschmer: Rechnung!
Menno, muss man hier alles selber machen? ;-)
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
Hallo noch mal,
leider war meine Freude etwas verfrüht.
Keine Fehlermeldungen zu bekommen ist leider nicht immer mit 'funktioniert auch' gleich zu setzen.
Die als VARCHAR deklarierte Variable 'keys_a' übernimmt zwar die Ergebnismenge der Funktion 'hmGetMatchKeys( ... )' (Rückgabewert: RETURNS SETOF character varying), scheint sich aber nur den ersten Wert zu "merken" ... daher werden meine Schleifen folglich auch nur ein mal durchlaufen.
Ich habe als work-arround erst mal 3 statische Tabellen angelegt, welche die Funktion meiner Variablen übernehmen. Durch diese iterieren jetzt meine Schleifen ordnungsgemäß ... aber mit einer Performance, die doch sehr zu wünschen übrig läßt (Die Informix-Version mit Variablen als Zwischenspeicher läuft 25x schneller)
Mach ich vielleicht bei der Wertzuweisung etwas falsch ?!
Viele Grüße,Code:keys_a := SELECT hmGetMatchKeys( ... Parameter ... );
Andreas
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen