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

Thema: Ergebnismenge in Variable packen

  1. #1
    kiaaap ist offline Benutzer
    Registriert seit
    08.05.2007
    Ort
    Ulm
    Beiträge
    31

    Standard Ergebnismenge in Variable packen

    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:
    Code:
    DEFINE varName  SET( LVARCHAR NOT NULL );
    --> hier wird ein sog. SET von LVARCHAR's übergeben.

    Viele Grüße,

    Andreas

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

    Standard

    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

  3. #3
    kiaaap ist offline Benutzer
    Registriert seit
    08.05.2007
    Ort
    Ulm
    Beiträge
    31

    Standard

    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;

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

    Standard

    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

  5. #5
    kiaaap ist offline Benutzer
    Registriert seit
    08.05.2007
    Ort
    Ulm
    Beiträge
    31

    Standard

    Ich habe folgendes Probiert:

    Code:
    DECLARE
       ...
       cur_a     VARCHAR(4);
       keys_a    VARCHAR NOT NULL;
       ...
    
    BEGIN
       ...
       keys_a    := SELECT hmGetMatchKeys( ... Parameter ... );
       ...
    
       FOR cur_a IN keys_a LOOP
       ...
    Leider funktioniert das aber so nicht, gibt immer einen 'Syntax Error at or near "select" '

    Wenn ich statt der Variablen das Select-Statement in der FOR-Schleife verwende funktioniert alles ... aber dann wird halt jedes mal die Funktion abgearbeitet.

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

    Standard

    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

  7. #7
    kiaaap ist offline Benutzer
    Registriert seit
    08.05.2007
    Ort
    Ulm
    Beiträge
    31

    Standard

    Das Problem mit der Variablen scheint gelöst zu sein.
    Code:
    keys_a    := hmGetMatchKeys( ... );
    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:
    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;
    Hier scheint irgendwas mit der Syntax nicht zu stimmen, aber die Fehlermeldung von PGAdminIII hilft da auch nicht wirklich weiter
    (Syntax Error at or near $1, LINE 1) :-(

  8. #8
    kiaaap ist offline Benutzer
    Registriert seit
    08.05.2007
    Ort
    Ulm
    Beiträge
    31

    Daumen hoch Das SELECT hat gefehlt ...

    Problem gelöst ... war ein syntaktischer Fehler:

    Code:
    FOR cur_a IN SELECT keys_a LOOP
    Es fehlte lediglich ein SELECT for der Variablen, welche die Ergebnismenge enthielt ...

    Vielen, vielen Dank !!!

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

    Standard

    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

  10. #10
    kiaaap ist offline Benutzer
    Registriert seit
    08.05.2007
    Ort
    Ulm
    Beiträge
    31

    Daumen runter ... funktioniert ... aber leider nicht richtig

    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 ?!

    Code:
    keys_a    := SELECT hmGetMatchKeys( ... Parameter ... );
    Viele Grüße,

    Andreas

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Variable Definieren
    Von trojannus im Forum SQL
    Antworten: 2
    Letzter Beitrag: 08.03.2012, 09:49
  2. variable für spaltennamen
    Von wuchermann im Forum Trigger und Funktionen
    Antworten: 8
    Letzter Beitrag: 14.05.2009, 15:25
  3. zufällige Zeile aus Ergebnismenge
    Von micho2 im Forum SQL
    Antworten: 3
    Letzter Beitrag: 29.10.2007, 21:16
  4. Antworten: 8
    Letzter Beitrag: 17.09.2007, 15:22
  5. SELECT_anweisung mit Variable
    Von Chuqa im Forum Trigger und Funktionen
    Antworten: 2
    Letzter Beitrag: 05.02.2007, 15:20

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