-
Fehlermeldung Cursor C1
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!
greetz
juniorprog
-
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
-
Wenn mehr als ein Datensatz gefunden wird ist SQLCOD nicht null.
Gruß aus Hanau
-
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.
greetz
juniorprog
-
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
Zitat von juniorprog
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!
-
Zitat von fred_hanau
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?
greetz
juniorprog
-
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?
greetz
juniorprog
-
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.
-
ok vielen dank, dann mach ich das so :-).
greetz
juniorprog
-
Zitat von juniorprog
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!
Hallo,
hier sind mehrere Punkte:
1. SQLCOD sollte nicht auf 0 sondern auf < 0 (für Fehler) und auf 100 für nicht gefunden abgefragt werden. Der Grund liegt darin, dass es Situationen gibt, in der eine Warnung ausgegeben wird (SQLCOD 1-99), die Daten jedoch trotzdem ausgegeben werden. Dies wurde mit Release V5R1M0 eingeführt und hat bei vielen zu einem bösen Erwachen geführt.
Werden für einen SELECT ... INTO-Befehl mehr als eine Zeile zurückgegeben, wird der erste Satz ausgegeben und Fehler-Meldung -811 ausgegeben. Du könntest also in Deiner Abfrage durch aus Sätze finden und der Rückkehr-Code ist nicht 0. Wenn Du die Feldwerte von Feld1 und Feld2 nicht unbedingt solltest Du einen COUNT(*) in der Abfrage verwenden.
2. Der Commit ist hier absolut überflüssig, da eine Select ... into-Anweisung grundsätzlich READ ONLY ist, und keine Daten festgeschrieben werden müssen. Der Commit ist sogar gefährlich, weil alles seit dem letzten COMMIT festgeschrieben wird und ein ROLLBACK zu einem ungewünschten Ergebnis führt. Zum anderen führt ein SQL-Commit (nicht ein RPG commit!), dass alle offenen Cursor, die nicht WITH HOLD definiert sind, geschlossen werden. Wird jetzt in einem vorgelagerten Programm versucht der nächste Datensatz zu lesen, kommt es zu dieser Fehlermeldung "Cursor nicht geöffnet".
3. Eine SELECT ... INTO-Anweisung fasst folgende SQL-Befehle zusammen und führt sie in einem Schritt aus:
DECLARE CURSOR, OPEN CURSOR, FETCH FIRST ROW, CLOSE.
Similar Threads
-
By TARASIK in forum IBM i Hauptforum
Antworten: 21
Letzter Beitrag: 30-03-11, 13:48
-
By ExAzubi in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 17-10-06, 16:48
-
By steven_r in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 14-08-06, 16:29
-
By schwenth in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 07-07-06, 17:22
-
By A_Mroos in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 26-06-06, 12:12
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks