[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte
  1. #1
    Registriert seit
    Sep 2005
    Beiträge
    79

    embedded SQL - close cursor

    Hallo zusammen.
    Ich mache meine ersten Gehversuche mit SQL im RPG.
    Funktioniert so weit so gut. In einer FOR-Schleife krieg ich aber den Cursor nicht mehr zu.
    For i=1 to n
    Fileselect = 'select * from ......'
    prepare Filesection from :Fileselect
    declare Filecursor cursor for Filesection
    open Filecursor using: Variable
    Dou SQLCOD = 100
    Fetch next from Filecursor into :File_ds
    If SQLCOD <> 100
    Verarbeitung
    endif
    close Filecursor
    endfor

    Wenn ich das PGM beende habe ich das File noch offen - HILFE!

  2. #2
    Registriert seit
    May 2002
    Beiträge
    1.121
    Also ich bin jetzt nicht der SQLRPGLE-Spezi, aber bei mir hat beim umwandeln die angabe CloSqlCsr(*ENDMOD) geholfen.

    gruß ronald

  3. #3
    Registriert seit
    Apr 2002
    Beiträge
    792
    Jo,

    oder das Programm in einer eigenen Activisiongroup laufen lassen.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    c/exec sql
    c+ set option closqlcsr=*endmod
    c/end-exec

    neben weiteren Optionen wie:
    commit=*none -- wenn ohne Transaktionen gearbeitet wird
    datfmt=*iso -- um sicherzustellen, das Datum-Felder 10-stellig verwendet werden
    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
    Sep 2005
    Beiträge
    79
    Zitat Zitat von Fuerchau
    c/exec sql
    c+ set option closqlcsr=*endmod
    c/end-exec

    neben weiteren Optionen wie:
    commit=*none -- wenn ohne Transaktionen gearbeitet wird
    datfmt=*iso -- um sicherzustellen, das Datum-Felder 10-stellig verwendet werden
    Super, das war´s. Viiiiielen Dank!
    Verstehen tu ich´s aber nicht. Im 1. Schleifendurchlauf schließt der close und im 2. nicht mehr. Und was hat das ganze mit einem Datum zu tun?

  6. #6
    Registriert seit
    Apr 2002
    Beiträge
    792
    das Datum hat nichts mit dem Cursor zu tun. Sind das denn immer andere Select-Statements die du da verarbeitest???

  7. #7
    Registriert seit
    Sep 2005
    Beiträge
    79
    Zitat Zitat von JonnyRico
    das Datum hat nichts mit dem Cursor zu tun. Sind das denn immer andere Select-Statements die du da verarbeitest???
    Nein! "select * from FILE where ALPHAFELD=?"
    In den Schleifendurchläufen wird jeweils ein anderer Inhalt dieses Feldes abgefragt.

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Dass der Cursor offen bleibt, hat intern was mit Optimierungen zu tun.
    Du kannst deine SQL's beschleunigen wenn du statische SQL's verwendest:

    declare Filecursor cursor for
    select * from FILE where ALPHAFELD=:MYFIELD

    MYFIELD wird einfach als RPG-Feld definiert.
    Damit sparst du dir den Prepare.
    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

  9. #9
    Registriert seit
    Sep 2005
    Beiträge
    79

    Thumbs up

    Besten Dank.

    Dann will ich euch mal nicht weiter aufhalten. Den Tipp mit dem statischen SQL und dem variablen Inhalt wird ich im nächsten Teil testen.

  10. #10
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Zitat Zitat von Armin
    Im 1. Schleifendurchlauf schließt der close und im 2. nicht mehr. Und was hat das ganze mit einem Datum zu tun?
    Beim ersten Durchlauf wird der Cursor in der Regel vom System geschlossen, da der Query Optimizer mindestens 2 Durchläufe benötigt um sich auf einen Zugriffs-Pfad festzulegen.

    Wenn der ODP (offener Zugriffs-Pfad) nicht geschlossen wird, was durch CLSSQLCSR = *ENDMOD am Ende des Moduls erfolgt. Wird der Optimizer bei jedem Durchlauf einen optimalen Zugriffs-Weg aus allen vorhanden Indices und geschlüsselten logischen Dateien ermitteln. Ist ein Zugriffs-Pfad bereits geöffnet entfällt dieser Overhead. Dies ist vorallem bei komplexen SQL-Statements von Vorteil.

    Allerdings ... bleibt der Zugriffspfad geöffnet und verändern sich die Daten so sehr, dass eigentlich ein anderer Zugriffs-Pfad optimaler wäre, erfolgt KEINE Neu-Ermittlung! Da hilft dann nur die Aktivierungs-Gruppe zu schließen, den Job zu beenden oder grundsätzlich mit CLSSQLCSR zu arbeiten.

    ... Und übrigens sollte man nicht SELECT * verwenden, sondern die Felder, die man benötigt gezielt auswählen. Daduch können mit einem Block mehr Daten eingelesen werden. Zum anderen kann der Optimizer einen Zugriffs-Pfad ermitteln, der einen Index ONLY-Access ermöglicht, d.h. alle benötigten Informationen sind bereits in den Schlüssel-Werten hinterlegt und ein zusätzlicher Zugriff auf den Datensatz ist nicht erforderlich.

    Birgitta
    Birgitta Hauser

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

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.365
    Hallo,

    hier muss man Cursor und ODP auseinanderhalten.
    Im Programm habe ich einen Cursor, dessen öffnen zur neu Psoitionierung führt und desse Status nur zwichenn open und close wechseln kann; alles andere verursacht Fehler.
    Die Datenbank kennt einen ODP, den sie besser offen lässt, da er meist nochmal gebraucht wird und der dann Sperren auf die Tables hat.
    Das ganze CLOSQLCSR Gedönse wirkt auf Cursor und nicht auf ODPs, auch wenn es zuweilen anders ausschauen mag!
    ODPs, die keiner benutzt, werden von SQL automatisch geräumt, wenn sie von SQL benötigt werden. Dasselbe erreicht man auch mit ALCOBJ CONFLICT(*RQSRLS) wenn einen das irgendwann mal stört.

    @Birgitta:
    Mit dem neu eröffnen von ODPS in laufenden Programmen habe ich unter V5R3 schon positive Überraschungen erlebt (nach anlegen eines Index)
    Wenn Daten komplett über einen Zugriffspfad geholt werden können, dann ist meist mit dem Design was faul, ausser bei Where in Subselect Konstrukten, wo select * eh' nicht geht.

    mfg

    Dieter Bender
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  12. #12
    Registriert seit
    Sep 2005
    Beiträge
    79
    Zitat Zitat von Fuerchau
    Dass der Cursor offen bleibt, hat intern was mit Optimierungen zu tun.
    Du kannst deine SQL's beschleunigen wenn du statische SQL's verwendest:

    declare Filecursor cursor for
    select * from FILE where ALPHAFELD=:MYFIELD

    MYFIELD wird einfach als RPG-Feld definiert.
    Damit sparst du dir den Prepare.
    Deinen Vorschlag auf statisches SQL zurückzugreifen hab ich versucht:
    declare Filecursor cursor for Filesection
    open Filecursor
    SQLCOD = -514 (kein prepaire durchgeführt) !?

    Andere Frage noch:
    In der SELECT-Anweisung wurden 2 Tabellen mit LEFT JOIN verbunden.
    Jedes Dateifeld einzeln anzusprechen find ich bei großem Umfang nervig. Deshalt "*" und INTO in die externe DS, die ich mit der DDS beschrieben habe. Was aber wenn ich nun 2 Tabellen anspreche?

Similar Threads

  1. SQL Sensitiver Cursor Probleme
    By Rincewind in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 18-12-06, 13:58
  2. Embedded SQL in VARPG
    By Squall in forum NEWSboard Programmierung
    Antworten: 23
    Letzter Beitrag: 18-10-06, 12:01
  3. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. Character verbinden in Embedded SQL
    By e_sichert in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 03-05-06, 10:47

Berechtigungen

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