[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Jan 2005
    Beiträge
    34

    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

  2. #2
    Registriert seit
    Nov 2003
    Beiträge
    26
    Könnte es sein dass Du gar nicht mit COMMIT arbeiten solltest ?

    Gruß aus Hanau

  3. #3
    Registriert seit
    Jan 2001
    Beiträge
    835
    Nurmal eine Nachfrage,

    ist es tatsächlich so das nur 1 Datensatz zurückkommt ?

    Gruss Michael

  4. #4
    Registriert seit
    Nov 2003
    Beiträge
    26
    Wenn mehr als ein Datensatz gefunden wird ist SQLCOD nicht null.

    Gruß aus Hanau

  5. #5
    Registriert seit
    Jan 2005
    Beiträge
    34
    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

  6. #6
    Registriert seit
    Nov 2003
    Beiträge
    26
    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

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    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 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!
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Jan 2005
    Beiträge
    34
    Zitat 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

  9. #9
    Registriert seit
    Jan 2005
    Beiträge
    34
    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

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.247
    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.
    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

  11. #11
    Registriert seit
    Jan 2005
    Beiträge
    34
    ok vielen dank, dann mach ich das so :-).
    greetz
    juniorprog

  12. #12
    Registriert seit
    Aug 2001
    Beiträge
    2.876
    Zitat 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.
    Birgitta Hauser

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

Similar Threads

  1. Java und Fehlermeldung jva0122 bei simplen "Hello World"
    By TARASIK in forum IBM i Hauptforum
    Antworten: 21
    Letzter Beitrag: 30-03-11, 13:48
  2. Eingabe sperren bei Fehlermeldung über API
    By ExAzubi in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 17-10-06, 16:48
  3. Fehlermeldung sichtbar machen
    By steven_r in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 14-08-06, 16:29
  4. Fehlermeldung 0000003 bei IPL auf Panel
    By schwenth in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 07-07-06, 17:22
  5. MCH0601 - Fehlermeldung
    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
  •