PDA

View Full Version : SQL wiederaufrufen des Programmes



Squall
27-10-06, 11:59
Hallo,

ich habe mir ein kleines SQL Prog geschrieben um festzustellen ob es die Eingabe des Users auch wirklich gibt. Beim 1. Aufruf des Prog. klappt alles wunderbar nur wenn ich beim 1. Aufruf einen falchen Wert eingebe und danach einen Richtigen, der funktioniert wenn ich ihn zuerst eingebe, bekomme ich wieder SQLCOD=100 obwohl es den Wert ja gibt. Was mache ich falsch?

Mein Code:

H DftActGrp(*NO) ActGrp(*CALLER)
H alwnull(*USRCTL)

/COPY LIB/FILE,DAVCOPY

DAUFNEHM PR EXTPGM('DAVSQL01')
D PARM1 likeds(DAV)
D PARM2 1A
D PARM4 like(SQLCOD)
D PARM5 LIKE(SQLSTT)

DAUFNEHM PI
D DAVDS likeds(DAV)
D fcall 1A
D SQLC LIKE(SQLCOD)
D SQLS LIKE(SQLSTT)

C eval SQLCOD=0
C eval fcall='J'
C/EXEC SQL
C+ Declare MyCsr Cursor for
C+ Select FIRKEN From LIB/FILE Where FIRKEN = :DAVDS.FIRKEN
C/End-Exec

C/EXEC SQL
C+ Open MyCsr
C/END-EXEC
C
C/EXEC SQL
C+ Fetch MyCsr
C+ into :DAVDS
C/END-EXEC
C if SQLCOD = 100
C or SQLCOD < *ZEROS
C eval fcall='E'
C eval *inlr=*on
C return
C elseif SQLCOD<>0 AND SQLCOD<>100 AND SQLCOD<>326
C eval fcall='F'
C eval SQLC=SQLCOD
C eval SQLS=SQLSTT
C eval *inlr=*on
C return
C endif
C/EXEC SQL
C+ Close MyCsr
C/END-EXEC
C eval *inlr=*on
C return

Gruß Martin

zannaleer
27-10-06, 12:13
Hallo Martin,

ich vermute, dass der Fehler darin liegt, dass der SQL-Cursor nicht geschlossen wird. Durch den Return-Befehl in der if-Bedingung wird die close-Bestimmung für den Cursor nicht ausgeführt.
Du solltest den Cursor schliessen und das Problem sollte behoben sein.

Gruß
Alexander

zannaleer
27-10-06, 12:23
Hallo Forum,

ist der SQL-Cursor in diesem Fall nicht überflüssig? Da es sich um einen single-row-fetch handelt, kann Martin doch auf den Cursor verzichten und sein Problem tritt auch nicht mehr auf, oder?

Gruß
Alexander

Squall
27-10-06, 12:30
Hallo Martin,

ich vermute, dass der Fehler darin liegt, dass der SQL-Cursor nicht geschlossen wird. Durch den Return-Befehl in der if-Bedingung wird die close-Bestimmung für den Cursor nicht ausgeführt.
Du solltest den Cursor schliessen und das Problem sollte behoben sein.

Gruß
Alexander

Ohje manchmal sieht man die einfachsten Dinge nicht. Danke!

zannaleer
27-10-06, 12:39
Hallo Martin,

ich habe gerade mal ein paar unserer Sourcen durchgesucht. Du kannst, wenn sichergestellt ist, dass nur ein Satz beim select gefunden wird, auf den Cursor verzichten.
Müsste dann so aussehen:
Select FIRKEN into :DAVDS From LIB/FILE Where FIRKEN = :DAVDS.FIRKEN


Dann brauchst Du Dir keine Gedanken über einen offenen oder geschlossenen Cursor machen.

Gruß
Alexander

Squall
03-11-06, 11:15
Hallo Alexander

danke für die Information, das Programm läuft jetzt auch gut, seitdem der Fehler mit dem Cursor entdeckt wurde. Aber es ist gut zu Wissen das sowas auch geht.

Gruß Martin