juniorprog
30-03-05, 10:25
ok vielen dank, dann mach ich das so :-).
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!
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.
juniorprog
30-03-05, 11:05
:) Besten Dank euch allen für die schnelle Hilfe/Aufklärung!!!