[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Mar 2006
    Beiträge
    98
    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 ;

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.964
    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!
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  3. #3
    Registriert seit
    Mar 2002
    Beiträge
    5.416
    ...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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.964
    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.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.416
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Frei Porn Site!
    By Fucasdreh in forum NEWSboard Server Job
    Antworten: 0
    Letzter Beitrag: 10-01-07, 13:12
  2. Brauche Hilfe
    By kuempi von stein in forum NEWSboard Java
    Antworten: 3
    Letzter Beitrag: 07-07-06, 16:03
  3. Brauche hapi_c.h und Hilfe bei Prog.
    By chullain in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 29-03-06, 09:18
  4. Brauche Hilfe zu FETCH USING DESCRIPTOR
    By AndreasH in forum NEWSboard Programmierung
    Antworten: 0
    Letzter Beitrag: 27-08-02, 09:41
  5. Brauche Hilfe im DDS
    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
  •