[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    May 2005
    Beiträge
    103

    Question SQL-Cursor: Mehrere gleichzeitig geöffnet

    Hallo zusammen,

    ein kleines SQLRPGLE ist folgendermaßen aufgebaut

    Declare Cursor1
    Declare Cursor2

    Open Cursor1
    Open Cursor2

    dow...

    fetch next from Cursor1

    fetch next from Cursor2

    enddo

    Close Cursor1
    Close Cursor2

    Der 2. Fetch liefert mir jedesmal SQLCode 100, obwohl der gesuchte Satz in der Datei vorhanden ist.
    Kommen sich die beiden gleichzeitig geöffneten Cursor in die Quere??

    -- Tobias

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Die Anzahl der Cursor spiel (fast) keine Rolle, nur die Namen müssen eindeutig sein.
    Da musst du mal beim Open den Variableninhalt (falls du mit Hostvariablen arbeitest) prüfen und/oder auch den SQLCOD nach dem Open prüfen.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    May 2005
    Beiträge
    103
    Danke für die schnelle Antwort!

    Arbeite mit einer Hostvariablen:
    Exec SQL
    Declare C2 Cursor for
    Select lmcode
    from fklocmst
    where lmpn = :TNr AND lmtqty <> 0
    group by lmcode
    order by max(lmtqty) desc;

    Die Variable TNr ist jedoch richtig bestückt und wenn ich folgendes SQL-Statement interkativ ausführe, dann erhalte ich auch den gewünschten Satz.

    Select lmcode
    from fklocmst
    where lmpn = '652493' AND lmtqty <> 0
    group by lmcode
    order by max(lmtqty) desc;

    Noch weitere Ideen? Wahrscheinlich seh' ich mal wieder vor lauter Wald die Bäume nicht :-(

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Die Anzahl der Cursor spiel (fast) keine Rolle, nur die Namen müssen eindeutig sein.
    Da musst du mal beim Open den Variableninhalt (falls du mit Hostvariablen arbeitest) prüfen und/oder auch den SQLCOD nach dem Open prüfen.

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo,

    1. Ist die Variable vor dem Open des 2.Cursors richtig bestückt oder erst vor dem Fetch?
    In diesem Fall darf der Cursor erst geöffnet werden, wenn die Variable richtig gesetzt ist.
    2. Bei der absteigenden Sortierung ist die Angabe MAX(Fld) überflüssig, da der größte Wert eh' als 1. ausgegeben wird.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    May 2005
    Beiträge
    103
    Hallo und vielen Dank für die Antwort/Lösung!

    Die Variable für den Fetch mit C2 wird durch den Fetch von C1 bestückt.
    Habe das PGM nun folgendermaßen umgestellt und jetzt funktionierts:

    Declare Cursor1
    Declare Cursor2

    Open Cursor1

    dow...

    fetch next from Cursor1

    Open Cursor2
    fetch next from Cursor2
    Close Cursor2

    enddo

    Close Cursor1

    Hätte nicht gedacht, dass ich den Cursor tatsächlich für jeden Schleifendurchlauf öffnen und schließen muss.

    Vielen Dank nochmals...

    -- Tobias


    Zitat Zitat von B.Hauser Beitrag anzeigen
    Hallo,

    1. Ist die Variable vor dem Open des 2.Cursors richtig bestückt oder erst vor dem Fetch?
    In diesem Fall darf der Cursor erst geöffnet werden, wenn die Variable richtig gesetzt ist.
    2. Bei der absteigenden Sortierung ist die Angabe MAX(Fld) überflüssig, da der größte Wert eh' als 1. ausgegeben wird.

    Birgitta

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Ist doch eigentlich logisch, dass der Open den Select ausführt.
    Der Fetch ruft doch nur noch das Ergebnis ab.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    May 2005
    Beiträge
    103
    War für mich nicht logisch. Ich dachte, der zum Fetch-Zeitpunkt gültige Wert der Variablen ist ausschlaggebend. Den Open Cursor habe ich ähnlich eines Open File-Befehls interpretiert. Nun weiß ich aber, dass dies wohl einem Aufsetzen in der Datei gleicht und der Fetch dann nur noch die Richtung des Lesens vorgibt.

    Deine Antwort mit dem Hinweis auf den Open brachte mich bereits auf die Lösung. Der Hinweis von Birgitta kam dann quasi zur Umwandlungszeit ;-)

    -- Tobias

    Zitat Zitat von Fuerchau Beitrag anzeigen
    Ist doch eigentlich logisch, dass der Open den Select ausführt.
    Der Fetch ruft doch nur noch das Ergebnis ab.

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    fetch next heißt fetch next, weil er den nächsten lesen soll... (denk mal drüber nach)

    ansonsten gibts auch noch einen select into, der wertet die Hostvariablen zur Ausführungszeit des select aus, bei dieser Variante muss man aber sicher sein, dass nur ein Satz zurück kommt, sonst gibts einen zwischen die Hörner.

    D*B

    Zitat Zitat von Tobse77 Beitrag anzeigen
    War für mich nicht logisch. Ich dachte, der zum Fetch-Zeitpunkt gültige Wert der Variablen ist ausschlaggebend. Den Open Cursor habe ich ähnlich eines Open File-Befehls interpretiert. Nun weiß ich aber, dass dies wohl einem Aufsetzen in der Datei gleicht und der Fetch dann nur noch die Richtung des Lesens vorgibt.

    Deine Antwort mit dem Hinweis auf den Open brachte mich bereits auf die Lösung. Der Hinweis von Birgitta kam dann quasi zur Umwandlungszeit ;-)

    -- Tobias
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    May 2005
    Beiträge
    103
    Hallo Dieter,

    da brauch ich nicht länger drüber nachzudenken; hab mich bei meiner letzten Antwort an Fuerchau ja schon belehrt gezeigt. (Wer lesen kann, ist besser dran! ;-) )

    Dass die Select into-Variante nur bei einem zu erwartenden Satz funktioniert, war mir auch klar. Deshalb ja der Cursor-Einsatz. Trotzdem Danke für den Hinweis.

    -- Tobias

    Zitat Zitat von BenderD Beitrag anzeigen
    fetch next heißt fetch next, weil er den nächsten lesen soll... (denk mal drüber nach)

    ansonsten gibts auch noch einen select into, der wertet die Hostvariablen zur Ausführungszeit des select aus, bei dieser Variante muss man aber sicher sein, dass nur ein Satz zurück kommt, sonst gibts einen zwischen die Hörner.

    D*B

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •