PDA

View Full Version : SQL Cursor



Seiten : [1] 2

Robi
24-08-21, 11:27
Moin zusammen,

ich hab hier was recht verrücktes ...

ein SQLRPGLE Pgm macht (immer in der Reihenfolge)

close c1

declare c1 cursor for ...

open c1

Schleife:
fetch next from c1 into ...
verarbeiten

...

seton LR

Wird in dem Ablauf das Pgm zum 2. mal gerufen liest der fetch Daten des ersten Aufrufes

CloseCursor steht auf endactgrp, die endet zwischen 2 aufrufen NICHT
Aber der exlizite Close müsste doch greifen?

ne Idee?

Robi

B.Hauser
24-08-21, 11:37
Hast Du den SQLCODE und/oder den SQLSTATE unmittelbar nach dem CLOSE und dem OPEN geprüft?
Ich könnte mir vorstellen, dass der CLOSE aus irgendeinem Grund nicht gemacht wird und deshalb auch der OPEN fehlschlägt und beim FETCH die nächsten Daten des Cursors liest.

Ansonsten müsste der explizite CLOSE greifen.

Birgitta

Robi
24-08-21, 12:06
danke Birgitta,

SQLCOD ist 0,
SQLSTATE ist 02000

Den State habe ich nicht beachtet, wo steht was das bedeutet?

Dschainers
24-08-21, 12:10
SQLSTATE ist 02000 = no row was fount

lt. Google

B.Hauser
24-08-21, 12:20
SQLCODE = 0 bedeutet eigentlich alles Okay und entspricht dem SQLSTATE = 00000.
SQLSTATE = 02000 heisst Record not found und entspricht dem SQLCODE = 100.

Wo,nach welchem SQL-Befehl hast Du denn den SQLCODE 0 und wo den SQLSTATE 02000? erst nach dem FETCH?

Robi
24-08-21, 12:25
nö, nach dem close



C FILL_MDS BEGSR
C*EXEC SQL
C* CLOSE C1
C*END-EXEC
SQLER6 = 5; //SQL
IF SQL_00024 = 0; //SQL B01
SQLROUTE_CALL( //SQL 01
SQLCA //SQL 01
: SQL_00022 //SQL 01
); //SQL 01
ELSE; //SQL X01
SQLCLSE_CALL( //SQL 01
SQLCA //SQL 01
: SQL_00022 //SQL 01
); //SQL 01
ENDIF; //SQL E01



eval sqlca
--> sqlcode 0
--> sqlstate 02000

V7R3

BenderD
24-08-21, 13:14
... da bräuchte man schon das ganze Programm. Wenn der fetch in den Ofen geht und die Zielvariablen nicht initialisiert waren...

Robi
25-08-21, 10:20
der fetch funktioniert ja

Es ist ein Subfile

Bsp.:
Anzeige 1
25 Sätze zu der gewählten Selektion

Anzeige 2. Aufruf
25 Sätze der gewählten Selektion und 1-5 Sätze der vorherigen

Das verstehe ich nicht

Werdem mir jetzt mal des sqlca mit einem ereignismerker in eine datei ausgeben um mehr infos zu bekommen.

B.Hauser
25-08-21, 10:44
Frage:
Wenn Du jeweils das SQL-Statement separat (z.B. mit STRSQL oder ACS) ausführst, bekommst Du dann die richtigen bzw. erwarteten Daten?
Die Ausgabe-Felder sind auch vor dem 2. Fetch wirklich sauber initialisiert?

Kannst Du das SELECT-Statement mal posten?

Robi
25-08-21, 10:54
Ja, einzelnd aufgerufen bekomme ich nur 'meine' Daten

Ablauf:
close
declare
open
fetch first
Schleife bis sqlcode <> 0: fetch next
(neu:) close
seton LR

der declare, schon mit und Ohne scroll versucht



WITH A AS(
SELECT CHGHIP.*, FERELE FROM CHGHIP, FELKAP WHERE
( CHKEYXX = :SUNRA OR
CHKEYXX = :SUNRB) AND
CHHERK <> 'EGA' AND

(CHFILE = 'SCHULP' OR
CHFILE = 'SCHUVP') AND
CHFILE=FEFILE AND CHFELD= FEFELD
AND (FEKORE = 1 OR FEKORE = 3) AND
SUBSTR(FERELE, 1, 2) <> 'S1' AND
SUBSTR(FERELE, 1, 2) <> 'S2'
) SELECT * FROM A
ORDER BY FERELE, CHFELD, CHDAEN DESC, CHKEYXX



der fetch (mal first mal next)
FETCH FIRST FROM C9 INTO :CHSATZ, :FERELE

CHSatz ist eine E DS auf ein PF
FERELE kommt aus der FELKAP die auch als E DS am Pgm ist

Robi