View Full Version : Fehlermeldung Cursor C1
juniorprog
30-03-05, 08:42
hallo @ alle (hallo@ alle).
ich habe ein problem und wende mich mal vertrauensvoll an euch.
wir setzen ein rpg programm ein, indem embedded sql drin ist um zu prüfen ob daten innerhalb eines variablen abfragezeitraums liegen:
C/EXEC SQL
C+ SELECT Feld1, Feld2 INTO :#FELD1, :#FELD2 FROM
C+ BIBLIOTHEK/DATEI WHERE FELDX=:#FELDX and FELDY=:#FELDY and
C+ VONDATUM<=:#VODT and BISDATUM>=:#BISDT
C/END-EXEC
Hiernach frag ich dann den SQLCOD ab um zu sehen ob der =0 ist, verarbeite die Rückkehrfelder
und anschliessend wird mit commit das ganze wieder freigegeben
C/EXEC SQL
C+ COMMIT
C/END-EXEC
Dieser Aufruf wird in einer Plausibilitätsprüfung eines Dialogprogramms aufgerufen. Nach dem beenden des Programms erhalte ich folgende Fehlermeldung: Cursor C1 nicht geöffnet. Ich nutze aber gar keinen Cursor C1, somit kann ich den auch nicht mit Close schliessen. Kann mir jemand sagen woran das liegen koennte. Denn laut meinen unterlagen muss ich doch nur einen Zeiger definieren wenn ich keine into felder habe??? danke schonmal im voraus!
fred_hanau
30-03-05, 09:18
Könnte es sein dass Du gar nicht mit COMMIT arbeiten solltest ?
Gruß aus Hanau
Nurmal eine Nachfrage,
ist es tatsächlich so das nur 1 Datensatz zurückkommt ?
Gruss Michael
fred_hanau
30-03-05, 09:25
Wenn mehr als ein Datensatz gefunden wird ist SQLCOD nicht null.
Gruß aus Hanau
juniorprog
30-03-05, 09:27
was passiert wenn ich den commit weglasse, bleibt die datei dann geöffnet? ich bin was embedded sql angeht absoluter neuling. Das mehrfach Sätze vorkommen ist ausgeschlossen. fange vorher ueber count ab ob auch nur 1 satz die obige bedingung erfüllt.
fred_hanau
30-03-05, 09:31
Wird in den Programm(en) überhaupt mit Transaktionen gearbeitet ?
Den Count kannst Du weglassen, da Du das Ergebnis vom Select sauber abfragst.
Gruß aus Hanau
Hallo,
sieht ganz danach aus, dass im Callstack oberhalb deines Programmes ein Programm sitzt, das einen Cursur C1 verwendet, der von deinem Commit platt gemacht wird und dann den Folgefehler auslöst. In deinem Programm ist der Commit überflüssig um den close oder nicht close brauchst du dich nicht zu kümmern, du sperrst keine Ressourcen. Alternativ wäre möglich deinem Programm eine eigene Activation Group zu verpassen.
mfg
Dieter Bender
hallo @ alle (hallo@ alle).
ich habe ein problem und wende mich mal vertrauensvoll an euch.
wir setzen ein rpg programm ein, indem embedded sql drin ist um zu prüfen ob daten innerhalb eines variablen abfragezeitraums liegen:
C/EXEC SQL
C+ SELECT Feld1, Feld2 INTO :#FELD1, :#FELD2 FROM
C+ BIBLIOTHEK/DATEI WHERE FELDX=:#FELDX and FELDY=:#FELDY and
C+ VONDATUM<=:#VODT and BISDATUM>=:#BISDT
C/END-EXEC
Hiernach frag ich dann den SQLCOD ab um zu sehen ob der =0 ist, verarbeite die Rückkehrfelder
und anschliessend wird mit commit das ganze wieder freigegeben
C/EXEC SQL
C+ COMMIT
C/END-EXEC
Dieser Aufruf wird in einer Plausibilitätsprüfung eines Dialogprogramms aufgerufen. Nach dem beenden des Programms erhalte ich folgende Fehlermeldung: Cursor C1 nicht geöffnet. Ich nutze aber gar keinen Cursor C1, somit kann ich den auch nicht mit Close schliessen. Kann mir jemand sagen woran das liegen koennte. Denn laut meinen unterlagen muss ich doch nur einen Zeiger definieren wenn ich keine into felder habe??? danke schonmal im voraus!
juniorprog
30-03-05, 09:36
Wird in den Programm(en) überhaupt mit Transaktionen gearbeitet ?
Den Count kannst Du weglassen, da Du das Ergebnis vom Select sauber abfragst.
Gruß aus Hanau
du meinst es reicht aus abzufragen ob der 0 ist, dann habe ich die gewissheit dass nur ein satz da ist? aber was ist wenn es mehrere sind, was für einen fehlercode fang ich dann ab, es soll naemlich ein hinweis ausgegeben werden dass der satz nicht eindeutig ermittelt werden konnte.
(vielleicht)blöde frage: was sind transaktionen?
juniorprog
30-03-05, 09:40
wann muss ich denn bei embedded sql mit commit etwas freigeben und wann nicht. hier handelt es sich ja um eine reine select anweisung. muss man den commit nach dem update/insert/delte anwenden?
Commit oder nicht Commit hängt ausschließlich von der Datenbank ab. Wird diese Journalisiert, ist bei Update/Insert/Delete ein Commit erforderlich. Beim Select wird ja nur gelesen.
Der Commit ist insoweit "gefährlich" als dass dieser alle Cursor schließt, die nicht explizit als über Commit-Grenzen hinweg offen zu halten definiert sind.
Beim Rollback werden die Cursor-Positionen genauso zurückgesetzt (beliebter Endlos-Loop, da das Programm immer bei dem selben Fehler einen Rollback macht und halt wiederholt bis der Fehler erneut kommt).
Setze in deinem Programm per
/exec sql
+ set option commit=*none
/end-exec
das Commit ausser Kraft und entferne das Commt.
SQLCOD = 100 => Keine Daten
SQLCOD = 0 => Daten vorhanden
SQLCOD < 0 => Mehr als 1 Satz oder auch sonstige Fehler.