View Full Version : 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
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.
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 :-(
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.
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
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
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
Ist doch eigentlich logisch, dass der Open den Select ausführt.
Der Fetch ruft doch nur noch das Ergebnis ab.
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
Ist doch eigentlich logisch, dass der Open den Select ausführt.
Der Fetch ruft doch nur noch das Ergebnis ab.
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
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
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
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