-
 Zitat von AndreasH
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 ;
-
Schau dir die Definition der SQLDA und SQLVAR in der QSYSINC (oder im Handbuch) mal an.
Irgendwo fehlen noch Reserve-Definitionen.
Das Problem:
Pointer müssen an einer 16-Byte-Grenze ausgerichtet sein!
-
...das macht der Compiler, falls man ihn nicht dran hindert und die Pointer in DS definiert. Im letzteren Fall heisßt das Zauberwort align
D*B
-
Bei Overlay kann er kein Align machen, das Overlay-Feld muss dann Align haben.
Trotzdem sollte die Definition passen da bei Align der übersprungene Speicher keine Initialisierung aufweist und SQL dann ggf. zur Laufzeit wieder meckert.
Die SQLDA und SQLVAR sollten lückenlos definiert sein.
Außerdem würde ich hier mit Qualiefied arbeiten und
D SQL_VAR LIKEDS(SQLVAR) DIM(SQL_NUM)
verwenden.
-
... die SQLDA und die SQLVARs sind so definiert, dass die Pointer aligned sind, wenn die SQLDA aligned ist, wenn man das natürlich falsch abpinselt, dann passt das nicht - und wenn das bei dem Pointer aufschlägt, ist das noch ein Glücksfall, weil das OS dann merkt, dass was faul ist, bevor da Murks zurückgeliefert wird.
D*B
Similar Threads
-
By Fucasdreh in forum NEWSboard Server Job
Antworten: 0
Letzter Beitrag: 10-01-07, 13:12
-
By kuempi von stein in forum NEWSboard Java
Antworten: 3
Letzter Beitrag: 07-07-06, 16:03
-
By chullain in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 29-03-06, 09:18
-
By AndreasH in forum NEWSboard Programmierung
Antworten: 0
Letzter Beitrag: 27-08-02, 09:41
-
By hs in forum IBM i Hauptforum
Antworten: 6
Letzter Beitrag: 26-09-01, 09:02
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks