[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Aug 2013
    Beiträge
    19

    Embedded SQL Cursor updaten

    Hallo,

    ich habe eine Subfile bei der man einen Satz zum Ändern auswählen kann. Nach erfolgter Änderung wird der geänderte Wert dann sofort in der Subfile angezeigt. Ich setze hier eine einseitige Subfile ein.

    Nun habe ich die Geschichte mit Embedded SQL gemacht, aber ich habe keinen Plan (außer natürlich den Cursor neu füllen) wie ich den geänderten Satz sofort anzeigen kann..

    Kann mir hier jemand weiterhelfen.

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Du kannst den Cursor SENSITIVE definieren.
    Dadurch bekommst du bei jedem FETCH die aktuellen Daten, auch wenn diese erst nach dem OPEN geändert wurden.

    lg Andreas

  3. #3
    Registriert seit
    Aug 2013
    Beiträge
    19
    Wie kann ich denn in dem CURSOR positionieren, damit eine neuer FETCH gemachr werden kann?

  4. #4
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Mit dem Schlüsselwort SCROLL kannst du den Cursor "scroll-fähig".
    Beim Fetch kannst du dann den Cursor positionieren wo du willst.

    Code:
    Exec Sql Fetch Current From c1 into :Ds;
    oder
    Code:
    Exec Sql Fetch Prior From c1 into :Ds;
    uvm.

    In der SQL Referenz (im Kapitel FETCH) findest du die komplette Doku darüber.

  5. #5
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Das ist da eher der falsche Weg, denn beim sensitiven Cursor bekommst du auch neue Sätze mit, die du noch nicht in der SFL hattest.
    Da ja nun mal zu jedem SFL-Satz ein eindeutiger Schlüssel gehört, solltest du den Cursor nur zum Füllen der SFL nehmen. Da du zum Update ja eine Where-Klausel hast, kannst du auch direkt einen "Select ... into ... from ... where ..." für einen einzelnen Satz ausführen.
    Mit dem Cursor kannst du nur "releativ" positionieren und das ist nun mal mühsamer.
    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

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Schau Dir mal die Erweiterungen LIMIT und OFFSET an.
    Wenn Du seitenweise füllst, setzt Du immer mit dem OFFSET (z.B. Satz 350 aus dem gesamten Result Set) auf und liest die mit LIMIT angegebene Anzahl an Datensätze in deine Subfile.
    Da Du bei jedem Füllen einen Open (multiple row) FETCH und einen Close machst, bekommst Du auch immer die aktuellen Daten.
    Offset Clause

    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

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Also das mit dem Offset/Limit wird ja gerne schon beim SQL-Server für Paging von Web-Seiten propagiert.
    Man sollte sich das allerdings gut überlegen, da die Positionierung mittels Offset immer langsamer wird, je weiter man sich nach hinten bewegt. Immerhin kann auch SQL hier nichts anderes tun als die Offset-Sätze zu überlesen. D.h., je komplexer ein SQL ist, um so schlimmer wird das nämlich, da nun mal alle Daten vor dem Offset ermittelt werden müssen um sie anschließend zu verwerfen.
    Sowas sollte man tunlichst bei z.B. UDF's, Group by oder Partition/OLAP-Funktionen vermeiden.

    Offset/Limit ist nämlich eine Funktion des Select's und nicht des Cursors.
    Ein statischer (insensitive) Scrollcursor ist da effektiver da man mittels "Fetch releative +/- N" eben positionieren kann und der SQL nicht noch mal neu berechnet wird.
    Möchte man aktualisierte Daten, kann man den Cursor dann eben schließen und neu öffnen.

    Für das SFL-Problem gibts daher 2 Möglichkeiten:
    Nach der Änderung die Subfile clearen, neu füllen und auf die gemerkte relative SFL-Position positionieren.
    Hier bekommt man alle Änderungen der Daten mit (also auch Veränderungen der nicht bearbeiteten Position), oder eben nur den einfachen SQL wie oben beschrieben.
    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

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Schön, dass Du wie immer genau Bescheid weißt, was im Untergrund abläuft.

    Was beim SQL Server schief läuft muss noch lange nicht bei der DB2 for i schieflaufen.

    Ob ich einen (scroll) Cursor geöffnet habe und immer wieder den nächsten Block nachladen muss bis ich zu den gewünschten Daten komme, bzw. bei sensitiven Cursorn immer alles nachladen muss, oder ob ich einen Cursor basierend auf Limit und Offset habe, bei dem gezielt nur die angeforderten Daten geladen werden, ist m.E. nicht egal!

    Über die Techniken, die im Untergrund implementiert sind, müssen die Daten beim LIMIT und OFFSET eben NICHT alle geladen werden, sondern der Zugriff erfolgt (über Pointer und andere effiziente Methoden) direkt auf die angeforderten Daten. Zuerst wird die Start-Position bestimmt und dann auf die Daten zugegriffen.

    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

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Ich habe diesbezüglich nun doch schon einiges ausprobiert.
    Bei kleinen Datenmengen und simplen Abfragen ist das ja alles gut und schön.
    Spätestens aber schon bei der Where-Klausel, die ja heute schon den Optimizer vor diverse Probleme stellt, ist das Verarbeiten und anschließende Verwerfen von Daten nicht gerade Performancesteigernd.
    Wenn z.B. per "Offset 1001 Limit 20" also 1000 Aufrufe der UDF vergebens sind sollte ich mir wirklich Gedanken über den Sinn hier machen.
    Auch bei "Group by ... having ... order by ..." besteht keine "Optimierung" außer eben der, die Berechnungen, Joins, Gruppierung und Sortierung durchzuführen um anschließend die ersten 1000 Ergebnisse weg zu schmeißen.

    Was da im Untergrund abläuft ist mir da letztlich wurscht, für mich zählt das Ergebnis.
    Man kann per STRSQL oder auch per QMQRY im Dialog ja sehr schön die Statususgabe betrachten und (wenn man dem Glauben schenken darf) durchaus mehrere Millionen Zugriffe angezeigt werden um wenige 100 Sätze zu bekommen.
    Im Diagnose-Modus per ODBC kann man dann durchaus verfolgen, dass dann manchmal weniger als 100 Sätze/Sekunde von der AS/400 bereitgestellt werden und man sich dann fragt, was der Optimizer da mal wieder gemacht hat.
    Und immer wieder tritt das z.B. beim Wechsel von V6 nach V7 auf da der Optimizer mal wieder optimiert wurde.
    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

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... irgendwie versteh ich die Argumentationen nicht. Der OP schrieb von einem Subfile und dem Update eines Subfilesatzes, da scheiden doch schon mal group by und Co aus. Wenn ein update aus einem Subfile möglich sein soll, muss dieser Satz doch einen Key haben und den Inhalt kenne ich doch auch, da kann ich doch die Anzeige im Subfile gerade rücken.
    Wenn ich denn eine Seite eines Subfiles neu aufbauen will, hilft mir doch weder offset und limit, noch ein scrollable Cursor, da ich doch in dem Subfile dirty Daten habe, die nicht vor konkurrierenden Änderungen, inklusive insert und delete, geschützt sind. Da kann ich doch nur beim ersten Satz mit einer passenden where clause aufsetzen und eine Seite neu lesen. Wo ist denn da ein Problem, außer dass die where clause je nach Sortierung nicht ganz trivial ist, wenn man über mehrere Felder sortieren will - aber gehen tut das auch elementar.

    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/

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    @D*B

    "Für das SFL-Problem gibts daher 2 Möglichkeiten:
    Nach der Änderung die Subfile clearen, neu füllen und auf die gemerkte relative SFL-Position positionieren.
    Hier bekommt man alle Änderungen der Daten mit (also auch Veränderungen der nicht bearbeiteten Position), oder eben nur den einfachen SQL wie oben beschrieben."

    Danke für die Bestätigung.
    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

  12. #12
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    ... warum soll ich da noch mal lesen müssen? Mein DAO (Datenzugriffs Modul) kennt den Inhalt des Subfiles (bei einem Bockfetch, der für dirty reads sinnvoll ist, brauche ich doch eh eine DS mit DIM - und warum soll ich die vor dem nächsten lesen löschen) und den veränderten Satz!

    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. Datei per SQL updaten mit Vorgänger
    By harbir in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 27-06-16, 15:04
  2. Rollender SQL-Cursor --> eingefrorenes System
    By Sebastian85 in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 31-03-16, 11:59
  3. Kann ein SQL Cursor übertragen werden?
    By dholtmann in forum NEWSboard Programmierung
    Antworten: 24
    Letzter Beitrag: 22-03-16, 19:40
  4. Datei ohne eindeutigen Schlüssel mit SQL Cursor abarbeiten und updaten
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 11
    Letzter Beitrag: 21-06-14, 18:54
  5. Berechtigung zum Updaten einer Tabelle
    By Sascha Storzum in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 22-08-02, 07:37

Berechtigungen

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