[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Oct 2015
    Beiträge
    109

    Wink Kann ein SQL Cursor übertragen werden?

    Hallo zusammen,

    ist es möglich einen SQL Cursor als Ein- Ausgabe einer Prozedur zu nutzen?
    Ich versuche momentan in einem Serviceprogramm per SQL einen Satz zu lesen,
    diesen dann zurück zu geben und beim nächsten Aufruf der Prozedur des Serviceprogramms an eben dieser Stelle (dafür die Übergabe des Cursors)
    weiter zu lesen.
    Leider scheiter ich schon, sobald ich den Cursor außerhalb des Exec SQLs ansprechen möchte.

    Ist das überhaupt möglich und wenn ja, wie muss entsprechende RPGLE Variable deklariert
    werden?

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Du kannst keinen Cursor übergeben, Du kannst ggf. über LIMIT und OFFSET genau den Datensatz lesen, den Du verarbeiten möchtest.
    Allerdings einzelne Sätze mit SQL zu lesen bringt nichts. SQL wird erst dann schnell, wenn ein Block von Daten gelesen und verarbeitet werden kann.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  3. #3
    Registriert seit
    Oct 2015
    Beiträge
    109
    Alles klar,
    dankeschön - aber schade.
    Bleibt mir der Cursor denn erhalten,
    wenn ich diese "externe" Prozedur mehrfach aus dem Selben Programm aufrufe?

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... wieso willst Du da einen cursor übergeben?. Du brauchst doch nur eine exportierte procedure getNextRecord(), die einen kompletten Datensatz zurückgibt. Das ist doch Basisgeschäft von Data Access Modulen. Und was die Performance angeht, die Unterschiede liegen unterhalb der Messbarkeit und bei entsprechender Programmierung (caching und Blockfetch) ist das schneller akls Rekord Löffel.

    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/

  5. #5
    Registriert seit
    Oct 2015
    Beiträge
    109
    Genau das versuche ich zu basteln.
    Allerdings möchte ich kein setll/read verwenden, da ich nach verschiedenen alten logischen Dateien lesen möchte. Momentan war mein Ansatz den Namen der logischen Datei zu übergeben, dann per dspfd den key zu lesen und diesen in das Order by des SQL zu geben.
    So weit so gut. Der erste Satz wird in die DS geschrieben und die Prozedur verlassen.
    Jetzt besteht mein Problem darin Satz zwei zu lesen.

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Da zäumst du dein Pferd von hinten auf.
    Dieser Ansatz ist für SQL grundfalsch.
    Befreie dich von der LF-Denke und kümmere dich ausschließlich um den SQL.
    Für jede Sortierung legst du halt 2 Funktionen an:
    - declare und Open des Cursors
    - Fetch next des Cursors und Close am Ende
    Dies führt zu statischen SQL's die erheblich performanter sind.
    Benötigst du eine neue Sortierung, gibts 2 neue Funktionen.
    Fehlt dazu ein Index, dann wird er halt angelegt.

    Dein Ansatz führt zu a) dynamischem SQL und b) zu keiner Garantie dass der Index (LF) auch verwendet wird.
    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

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... von Pferden kann man offenkundig unterschiedliche Meinungen haben...
    für Deinen Ablauf würde ich dem Serviceprogramm eine procedure setOrderBy geben und eine openCursor. Im Serviceprogramm muss man dann drauf achten, dass das beim CRTSQLMOD kein CLOSSQLCSR(*ENDMOD) drinsteht, damit einem der Cursor nicht geschlossen wird.
    Dynamic SQL ist von der Performance keinerlei Problem, Programm technisch auch nicht, letzte Woche habe ich das wieder mal in einem Workshop mit totalen ILE Newbies in den Übungen implementieren lassen.

    D*B

    PS: lass dich nicht ins Boxhorn jagen, wg. dynamic SQL und so - auf anderen Büchsen greift man immer auf diese Art und Weise mit Zugriffsmodulen auf SQL Datenbanken zu.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    Oct 2015
    Beiträge
    109
    Dankeschön euch!
    Unabhängig von der Lösung habe ich jetzt das Problem, dass mein "declare" scheinbar
    keinerlei Beachtung vom Compiler findet.

    Vor dem declare kann ich sqlcode beliebig setzen (mit ev im debug).
    dann kommt mein Codestück:

    Code:
             exec sql declare  fieldcursor cursor for
                      select   apkeyf, apkseq
                      from     tmprcdfmt
                      order by apkeyn asc;
    
    
             if sqlcode <> 0;
               ind_fehler = *on;
               return ind_fehler;      
             endif;
    und mein sqlcode hat danach immernoch den selben Wert, als hätte er nicht
    einmal versucht den Cursor zu setzen.
    exec sql open xy oder close xy dagegen finden Beachtung.
    Habt ihr da eine Idee?

    Das Modul erstelle ich so:
    Code:
    CRTSQLRPGI 
                 OBJ(TESTLIB/SQLTEST)      
                 SRCFILE(TESTLIB/QRPGSRC) 
                 SRCMBR(SQLTEST)             
                 OBJTYPE(*MODULE)           
                 REPLACE(*YES)              
                 DBGVIEW(*SOURCE)

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Declare ist nur die Beschreibung, wie auf die Daten zugegriffen werden soll.
    Eine Aktion erfolgt erst beim Open und bei diesem kann der SQLCODE dann geprüft werden.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  10. #10
    Registriert seit
    Oct 2015
    Beiträge
    109
    Das erklärt einiges!
    Dann darf ich da den SQLCode einfach noch nicht abfragen.
    Perfekt.
    Dankeschön!

  11. #11
    Registriert seit
    Oct 2015
    Beiträge
    109
    Hallo,
    habe jetzt alles hinbekommen.
    Meine Prozedur zum Lesen sieht wie folgt aus:
    dcl-pi pr_ar_readsql ind;
    DS_Input likeds(DS_Datei);
    end-pi;
    //-----------------------------------------------------------------------
    // Variablen
    //-----------------------------------------------------------------------
    dcl-ds DS_SQL_Out ext extname('AR') end-ds;
    dcl-s ind_fehler ind;
    dcl-s cha_statement char(500);
    //-----------------------------------------------------------------------
    // Verarbeitung
    //-----------------------------------------------------------------------
    ind_fehler = *off;
    exec sql fetch cursor_ar into S_SQL_Out;
    if sqlcode <> 0;
    ind_fehler = *on;
    if sqlcode = 100;
    exec sql close cursor_ar;
    clear ds_input;
    endif;
    else;
    DS_Input = DS_SQL_Out;
    endif;
    Bei ungefähr 600.000 Sätzen benötige ich ungefähr 38 Sekunden.
    Native IO schafft das Ganze in 3-7 Sekunden.
    Liegt das am Prozeduraufruf? Oder am Fetch?
    Habt ihr Ideen wie das schneller funktioniert?

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.236
    Da kommt schon einiges an Overhead zusammen.
    Zunächst mal die Frage ob du bei Native-IO die Datei als Input oder Update definiert hast?
    Beim Input wird geblockt gelesen und dann z.T. nur noch Zeiger versetzt.
    Realer Vergleich geht nur mit ungeblocktem Lesen.
    Hast du für Native-IO auch den Prozedur-Overhead programmiert?

    Und dann schau dir mal die Listauflösung an.
    Für SQL wird jede Variable 2 mal deklariert, 1 x SQL-XXX und dann eben Dein Feld.
    Der Overhead liegt nun in den vielen Aufrufen und Übergaben und zusätzlichen Moves begründet.
    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

Similar Threads

  1. Antworten: 1
    Letzter Beitrag: 12-08-14, 12:02
  2. RPG-Bildschirm-Datei kann nicht angezeigt werden
    By hartmuth in forum NEWSboard Programmierung
    Antworten: 12
    Letzter Beitrag: 27-11-13, 14:27
  3. Teildatei xx kann bei UPDPROD(*NO) nicht eröffnet werden.
    By tarkusch in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 31-10-13, 21:14
  4. Drucker kann nicht gestartet werden
    By Spirou in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 25-02-03, 11:57
  5. V5R1 Spooldatei kann nicht kopiert werden
    By Wolfgang in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 16-11-01, 09:17

Tags for this Thread

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •