[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.232
    Tja, erstmal vielen Dank für die zahlreichen Antworten. Ich muss zugeben, dass ich immer noch nicht so genau weiß, was der beste Weg ist. Ist es nicht so, dass man für Commitment Control Journaling braucht? Das hatten wir bisher nicht auf allen Tabellen. Aber jetzt wird bei uns gerade ein iCluster aufgesetzt und damit bekommen wir das flächendeckend. Birgitta hat genau erkannt, was wir wollen: Ein simpler chain mit dem Primärschlüssel und einige Zeit später (nachdem der User etwas editiert hat) ein Update (oder Unlock auf dem Datensatz). Die meisten anderen Zugriffe machen wir bei uns bereits per SQL. Bei dem oben beschriebenen Problem würden wir am liebsten gar keinen Cursor definieren und den Satz mit fetch einlesen. Stattdessen würden wir gern mit "Select * into " arbeiten. Wir wissen ja, dass wir nur genau einen Datensatz lesen werden (Primärschlüssel im where).

    Wenn noch jemand einen guten Gedanken hat, immer her damit. Ansonsten werde versuchen, nochmal ein wenig in der Literatur zu stöbern.

    Vielen Dank soweit.

    Dieter

  2. #2
    Registriert seit
    Jan 2007
    Beiträge
    1.023
    Der Lock mit SQL geht nur mit einem Pointer. Die sauberste Lösung ist die, die D.B. beschrieben hat: Commitment Control und Journaling.
    kf

  3. #3
    Registriert seit
    Jul 2011
    Beiträge
    31
    Zitat Zitat von camouflage Beitrag anzeigen
    Der Lock mit SQL geht nur mit einem Pointer. Die sauberste Lösung ist die, die D.B. beschrieben hat: Commitment Control und Journaling.
    Hallo!

    Könntest du bitte etwas genauer erklären was du damit meinst? (bezüglich Lock und Pointer höre ich zum ersten Mal)

    Danke,
    Saman

  4. #4
    Registriert seit
    Jan 2007
    Beiträge
    1.023
    Hier ein kleines Beispiel

    PHP-Code:
    C/EXEC SQL 
    C
    + Declare Cursor .... 
    C+ For Update Of Field1Field2, .... FieldN 
    C
    /END-EXEC
     
    C
    /EXEC SQL Open Cursor 
    C
    /END-EXEC
     
    C
    The record gets locked with the FETCH statement 
    C
    /EXEC SQL Fetch next From Cursor 
    C
    /END-EXEC
     
    C
    * Do some processing 
    C
    * .....
     
    C/EXEC SQL Update .... 
    CSet Field1 = :XField2 = :Y, .... FieldN = :
    C
    Where Current of Cursor 
    C
    /END-EXEC
     
    C
    /EXEC SQL Close Cursor 
    C
    /END-EXEC 
    Chain/Update ist halt schon ein bisschen einfacher, wer's mag.
    kf

  5. #5
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Dann meinst du wohl mit Pointer eigentlich einen SQL Cursor!?!

    Ich würde das Beispiel so schreiben:
    Code:
    D tab1ds    E DS          extname(Tab1)
    /Free
     EXEC SQL Declare c1 Cursor For Select * From Tab1
       For Update;
     
     EXEC SQL Open Cursor;
     
     // The record gets locked with the FETCH statement 
     EXEC SQL Fetch Cursor Into :tab1ds;
      
     // Do some processing 
     
     EXEC SQL Update Tab1 set Row = (:tab1ds) Where Current of c1;
    
     EXEC SQL Close Cursor;
    /End-Free
    Dadurch braucht man bei Tabellenänderungen das Programm einfach nur neu erstellen lassen, wenn nötig. Und man ersparrt sich die angabe jeder Spalte.
    Und Free ersparrt auch ein paar Zeilen

    lg Andreas

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.943
    Zitat Zitat von camouflage Beitrag anzeigen
    Hier ein kleines Beispiel

    PHP-Code:
    C/EXEC SQL 
    C
    + Declare Cursor .... 
    C+ For Update Of Field1Field2, .... FieldN 
    C
    /END-EXEC
     
    C
    /EXEC SQL Open Cursor 
    C
    /END-EXEC
     
    C
    The record gets locked with the FETCH statement 
    C
    /EXEC SQL Fetch next From Cursor 
    C
    /END-EXEC
     
    C
    * Do some processing 
    C
    * .....
     
    C/EXEC SQL Update .... 
    CSet Field1 = :XField2 = :Y, .... FieldN = :
    C
    Where Current of Cursor 
    C
    /END-EXEC
     
    C
    /EXEC SQL Close Cursor 
    C
    /END-EXEC 
    Chain/Update ist halt schon ein bisschen einfacher, wer's mag.
    Das ist doch genau das, was ich zuvor vorgeschlagen habe?!

    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

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.943
    [QUOTE=dschroeder;81818]Ist es nicht so, dass man für Commitment Control Journaling braucht?
    [QUOTE]

    Journaling bzw. die Aufzeichnung der physischen Dateien bzw. SQL Tabellen im Journal ist die Voraussetzung für die Verwendung von Commitment Control.

    Zitat Zitat von dschroeder Beitrag anzeigen
    Bei dem oben beschriebenen Problem würden wir am liebsten gar keinen Cursor definieren und den Satz mit fetch einlesen. Stattdessen würden wir gern mit "Select * into " arbeiten. Wir wissen ja, dass wir nur genau einen Datensatz lesen werden (Primärschlüssel im where)
    ... nur beim SELECT ... INTO kann kein Satz gesperrt werden, da "under the cover" immer ein OPEN, FETCH, CLOSE erfolgt.

    @Andreas
    Der Datensatz wird beim Update zwar freigegeben, da der Cursor (beim Update) nicht weiterbewegt wird und auf dem Satz bleibt, kann erst nach dem nächsten Fetch bzw. Close wieder auf den Satz im Update-Modus zugegriffen werden.

    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

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.390
    Unter dem passenden Commit Level wird der Satz auch beim select into gesperrt. Schau Dir mal die Commit Level Einstellungen an.
    BTW: Einsatz von SQL ohne Commit Steuerung ist ein ernsthafter Designfehler, das machen nur Wahnsinnige und/oder Ahnungslose!!! Und der Einsatz von Journaling ist auch ohne Einsatz von Commit von großem Nutzen!!!

    D*B

    Zitat Zitat von dschroeder Beitrag anzeigen
    Tja, erstmal vielen Dank für die zahlreichen Antworten. Ich muss zugeben, dass ich immer noch nicht so genau weiß, was der beste Weg ist. Ist es nicht so, dass man für Commitment Control Journaling braucht? Das hatten wir bisher nicht auf allen Tabellen. Aber jetzt wird bei uns gerade ein iCluster aufgesetzt und damit bekommen wir das flächendeckend. Birgitta hat genau erkannt, was wir wollen: Ein simpler chain mit dem Primärschlüssel und einige Zeit später (nachdem der User etwas editiert hat) ein Update (oder Unlock auf dem Datensatz). Die meisten anderen Zugriffe machen wir bei uns bereits per SQL. Bei dem oben beschriebenen Problem würden wir am liebsten gar keinen Cursor definieren und den Satz mit fetch einlesen. Stattdessen würden wir gern mit "Select * into " arbeiten. Wir wissen ja, dass wir nur genau einen Datensatz lesen werden (Primärschlüssel im where).

    Wenn noch jemand einen guten Gedanken hat, immer her damit. Ansonsten werde versuchen, nochmal ein wenig in der Literatur zu stöbern.

    Vielen Dank soweit.

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

  9. #9
    Registriert seit
    Jan 2007
    Beiträge
    1.023
    @Birgitta
    Bin ganz bei dir, dachte nur ich stell das Ganze ein bisschen strukturierter dar.

    Und bzgl. des Pointers war ich wohl etwas abwesend, meinte natürlich schon den Cursor.
    kf

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.790
    @Andreas
    Mehrere Updates bleiben nur gesperrt, wenn man unter CommitControl arbeitet.
    Satzsperren aller Aktionen bleiben dann bis zum Commit/Rollback erhalten.
    Dies geht auch über einen Close hinaus.
    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

  11. #11
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von Fuerchau Beitrag anzeigen
    @Andreas
    Mehrere Updates bleiben nur gesperrt, wenn man unter CommitControl arbeitet.
    Satzsperren aller Aktionen bleiben dann bis zum Commit/Rollback erhalten.
    Dies geht auch über einen Close hinaus.
    Das stimmt wenn du ein einfaches UPDATE durchführst.
    Jedoch im angegebenen Beispiel sperrt der Cursor den Satz.
    (siehe auch Kommentar von Birgitta)

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.790
    Du meintest also mehrere Updates auf dem selben Satz.
    Aber auch SQL verlangt nach einem Update einen neuen Read / Fetch, da ein Update die Sperre (ohne CommitControl) wieder aufhebt, da ein "Update current" ohne Read nicht geht.
    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. Record Abfrage per SQL ?
    By schatte in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 28-08-09, 17:44
  2. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 11:15
  3. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 15:53
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 15:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 10:43

Berechtigungen

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