PDA

View Full Version : Brauche Hilfe zu FETCH USING DESCRIPTOR



AndreasH
27-08-02, 10:41
Hallo zusammen.
Dies ist eine etwas überarbeitete Kopie aus dem iseries AS/400 Forum, aber diesmal im "richtigen" Forum :-)
Ich bin am verzweifeln beim Zusammenbauen eines dynamischen SQL Statements.
Die ausgewählten Felder werden erst zur Laufzeit festgelegt.
Ich habe eine SQLDA entsprechend SQL Reference aufgebaut.
Hier, was im Beispiel des Handbuches steht (leider ist das Beispiel für PL1, aber der Unterschied scheint nur im "fehlenden" END-EXEC zu bestehen...
EXEC SQL PREPARE STMT1_NAME FROM :STMT1_STR;

... /* code to set SQLN to zero and to allocate the SQLDA */
EXEC SQL DESCRIBE STMT1_NAME INTO :SQLDA;

... /* code to check that SQLD is greater than zero, to set */
/* SQLN to SQLD, then to re-allocate the SQLDA */
EXEC SQL DESCRIBE STMT1_NAME INTO :SQLDA;

... /* code to prepare for the use of the SQLDA */
EXEC SQL OPEN DYN_CURSOR;

... /* loop to fetch rows from result table */
EXEC SQL FETCH DYN_CURSOR USING DESCRIPTOR :SQLDA;

Hier nun mein Sorgenkind
D SQL_NUM C CONST(2)
D SQLDA DS
D SQLDAID 1 8A
D SQLDABC 9 12B 0
D SQLN 13 14B 0
D SQLD 15 16B 0
D SQL_VAR 80A DIM(SQL_NUM)
D SQLVAR DS
D SQLTYPE 1 2B 0
D SQLLEN 3 4B 0
D SQLRES 5 16A
D SQLDATA 17 32*
D SQLIND 33 48*
D SQLNAMELEN 49 50B 0
D SQLNAME 51 80A
C*SQL_NUM ist die hier benutze Anzahl Felder
STMT='SELECT FELD1, FELD2 FROM DATEI'

C/EXEC SQL
C+ PREPARE S1 FROM :SQLSTMT
C/END-EXEC

SQLN = *ZEROS

C/EXEC SQL
C+ DESCRIBE S1 INTO :SQLDA
C/END-EXEC


IF SQLD<= 0
return
endif
sqln = sqld

C/EXEC SQL
C+ DESCRIBE S1 INTO :SQLDA
C/END-EXEC
C* Jetzt steht nach debug tatsächlich sauber in der SQLDA die "Feldinfo" in der SQL_VAR Tabelle. Die Pointer SQLDATA und SQLIND sind nicht *NULL!

C* Open Cursor
C/EXEC SQL
C+ OPEN C1
C/END-EXEC

C dow sqlcod = 0
* Fetch a row
C/EXEC SQL
C+ FETCH NEXT FROM C1 USING DESCRIPTOR :SQLDA
C/END-EXEC
C SQLCOD IFNE 0
C LEAVE
C ENDIF
C ENDDO
C/EXEC SQL
C+ close c1
C/END-EXEC
C MOVE *ON *INLR


Nach dem Fetch ist der SQL Code auf -822.
Im Joblog steht:
PREPARE für Anweisung S1 beendet
DESCRIBE für vorbereitete Anweisung S1 beendet
DESCRIBE für vorbereitete Anweisung S1 beendet
Blockung für Abfrage
Cursor C1 eröffnet
SQLDA enthält ungültige Adresse
-- Art 1 gibt an, daß die SQLDATA-Adresse ungültig ist

Ich hab nun schon versucht, einfach pointer einzustellen, die auf eine leer DS weisen, aber das bringts auch nicht. Hat jemand von euch/Ihnen ein Beispielprogramm oder einen Tip, was da mit "allocate SQLDA" und reallocate SQLDA gemeint ist und wie das funktioniert??

Verwendetes Release in V4R5

Danke