PDA

View Full Version : SQL Fetch



mk
08-05-12, 11:40
Hallo zusammen,

In einem SQLRPGLE Programm soll eine mit SQL erstellte Tabelle nach dem erstellen mit fetch gelesen werden.

Hier das erstellen der Tabelle:

EXEC SQL
create table qtemp/spo1p as (

SELECT xxxxxxx
FROM xx
Where xxxx
) with data ;


Anschließend erfolgt im Programm die Leseroutine

EXEC SQL
Declare theSpo Cursor for

SELECT acut#, adate
From qtemp/spo1p ;

EXEC SQL Close theSpo ;
EXEC SQL Open theSpo ;

DoU SqlCode <> *zeros ;
EXEC SQL
Fetch next from theSpo into :wk_acut# ,
:wk_adate ;
arec= arec+ 1;
if SqlCode <> 100 ;

if xxxxx
callp DeleteaSpo( wk_acut#);
anr = anr + 1;
EndIf ;

EndIf ;

EndDo;

EXEC SQL Close theSpo ;


Der Fetch liest nur 2 Datensätze, obwohl ein paar tausend Sätze in der Tabelle vorhanden sind .

Die Felder arec und anr sind nur Zähler.



Muss man nach dem create table with data
vielleicht noch einen Close oder ähnliches machen ?

Gruß
Michael

Fuerchau
08-05-12, 12:00
Bist du sicher, dass auch wirklich SQLCOD = 100 auftritt ?
Vielleicht gabs ja einen anderen SQL-Code ab dem 3. Satz (Konvertierungsproblem, NULL-Anzeiger o.ä.).

Man sollte den SQLCOD schon gezielter abfragen:

exec sql fetch ...;
if SQLCOD <> *zero;
leave;
endif;

Schließlich bedeutet
0 = Daten gelesen
100 = EOF
< 0 = Fehler beim Lesen

mk
08-05-12, 12:25
Hi,

ich schäme mich ja soooooooooooo..............

In einer der weiteren Prozeduren wurde ein delete
abgesetzt und da kein Satz für den delete gefunden wurde
kam der sqlcod 100 und beendete die schleife.

Man sollte sich die Programm doch genauer ansehen. Ich war
davon ausgegangen das die Nr unique ist.

Vielen Dank für den Denkanstoß
Gruß
Michael

Fuerchau
08-05-12, 12:33
Gerade deshalb mache ich das meist so:

dow 1=1;
exec sql fetch ...;
if SQLCOD <> *zero;
leave;
endif;
:
enddo;

Da passiert sowas dann gar nicht.

mk
08-05-12, 12:48
Hi ,

cool :D

schönen Gruß
Michael

B.Hauser
09-05-12, 16:06
Gerade deshalb mache ich das meist so:

dow 1=1;
exec sql fetch ...;
if SQLCOD <> *zero;
leave;
endif;
:
enddo;

Da passiert sowas dann gar nicht.

Ich würde allerdings nicht auf <> 0 abfragen weil:
1. Ein Fehler ausgegeben werden könnte
2. Eine Warnung ausgegeben werden könnte, bei der der Datensatz ausgegeben wird und verarbeitet werden kann.

Besser ist es auf = 100 und < *Zeros abzufragen:

...

If SQLCOD = 100;
Leave;
ElseIf SQLCOD < *Zeros;
//Fehlerbehandlung
Iter/Leave - whatever
EndIf;
//Verarbeitung


Schöne Grüße von der Common Conference im sonnigen (wenn auch etwas kühlen) Kalifornien.

Birgitta