Zitat Zitat von AndreasH Beitrag anzeigen
Hallo zusammen.
Ich bin am verzweifeln beim Zusammenbauen eines dynamischen SQL Statements.
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
Hallo,

ich habe auch so ein ähnliches Problem, ich will die sqlda nutzen.

was ist da falsch definiert????
Folgender Fehler bekomme ich bei RDI wen ich es kompilieren will.



RNF7433 Zeigerunterfeld SQLDATA ist nicht korrekt ausgerichtet; die Bestimmung wird ignoriert.
RNF7433 Zeigerunterfeld SQLIND ist nicht korrekt ausgerichtet; die Bestimmung wird ignoriert.
RNF0533 Die Länge von Feld SQLLEN mit ganzer Zahl oder ohne Vorzeichen ist ungültig.

D* SQL DESCRIPTOR AREA
D SQLDA DS
D SQLDAID 8A
D SQLDABC 10I 0
D SQLN 5I 0
d SQLD 5I 0
D SQL_VAR 80A DIM(SQL_NUM)
D 33 48*
D 49 64*
D***
D SQLVAR DS
D SQLTYPE 5I 0
D SQLLEN 6I 0
D SQLRES 12A
D SQLINFO1 16A
D SQLDATA * OVERLAY(SQLINFO1:1)
D SQL_RESULT_SET_LOCATOR...
D 20I 0 OVERLAY(SQLINFO1:1)
D SQLINFO2 16A
D SQLIND * OVERLAY(SQLINFO2:1)
D SQL_ROW_CHANGE...
D 10I 0 OVERLAY(SQLINFO2:1)
D SQL_RESULT_SET_ROWS...
D 10I 0 OVERLAY(SQLINFO2:1)
D SQLNAMELEN 5I 0
D SQLNAME 30A
D** END OF SQLDA
D** EXTENDED SQLDA
D SQLVAR2 DS
D SQLLONGL 1 4I 0
D SQLRSVDL 5 32A
D SQLDATAL 33 48*
D SQLTNAMELN 49 50I 0
D SQLTNAME 51 80A
D** END OF EXTENDED SQLDA
D sql_num c const(80)
D** End of SQLDA
D***

EXEC SQL
INCLUDE SQLDA;
EXEC SQL
set option datfmt=*iso;
EXEC SQL
PREPARE SELECTION FROM :stm ;
EXEC SQL
declare C1 cursor for selection ;
EXEC SQL
OPEN C1 ;

dou sqlcod = 100 ;
EXEC SQL
FETCH C1 USING DESCRIPTOR :SQLDA ;
if sqlcod = 100; // €Dateiende
leave ;
endif ;

if sqlcod < *Zeros ;
and sqlcod <> -801 ;
leave ;
endif ;


enddo ;
EXEC SQL
CLOSE C1 ;