[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jul 2003
    Beiträge
    331

    embedded SQL, Satz geschützt

    [/PHP]
    In einem RPG-Programm mit embedded SQL verwende ich
    eine Datei, die abwechselnd mit 2 SQL-Cursor
    verarbeitet wird.

    Mit dem 1. Cursor lese ich bestimmte Sätze aus der
    Datei mit declare Cursor1
    open Cursor1
    fetch Cursor1
    ....
    close Cursor1
    Mit dem 2. Cursor lese ich Sätze und lösche einige davon
    declare Cursor2
    open Cursor2
    fetch Cursor2
    delete from myDatei where current of
    Cursor2

    Die beiden Cursor nicht nicht gleichzeitig geöffent.

    Beim Löschen kommt der SQL-Code -906 mit dem Text:
    Cursor Cursor2 für Datei myDatei schreibgeschützt.

    Was muss ich beachten, damit es klappt ?
    [PHP]

    mfg Ludger

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    Hallo,

    Nur so eine Idee:
    wenn Du im Declare-Statement des ersten Cursors am Ende FOR READ ONLY (oder FOR FETCH ONLY) hinzufügst, stellst Du sicher, dass dieser Cursor nur als INPUT ONLY verarbeitet wird. werden

    PHP-Code:
    C/EXEC SQL
    C
    +  DECLARE Cursor ....
    C+     SELECT ....
    C+ FOR READ ONLY 
    Der zweite Cursor sollte als SCROLL CURSOR definiert sein.

    Wenn das nicht helfen sollte, müsste man das SELECT-Statement des zweiten Cursors sehen. Vielleicht ist der zweite Cursor aus irgendeinem Grund nicht "deletable".

    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
    Jul 2003
    Beiträge
    331

    Wink

    Hallo Brigitta,

    nachdem der Stromausfall beseitigt war und der Schnee weggeräumt ist, hatte ich Gelegenheit, Deine Anregung zu testen. Leider hat es nicht geklappt.

    Nachstehend nun das Declare des 2. Cursors, bei dem der DELETE nicht klappt.
    PHP-Code:
      
     
    *============================================ 
     
    C     de_bolvsn_02  begsr                                          
     c
    /exec sql                                                         
     c
    +  declare C_bolvsn_02 cursor for                                 
     
    c+        select  *                                                
     
    c+                from  bolvsnpf                                   
     c
    +                where bvlfsnr = :cpkomm                          
     c
    +                  and bvauftr = :cpauft                          
     c
    +                  and bvposit = :cpapos                          
     c
    +                order by  bvlfsnrbvauftrbvpositbvstcknr    
     c
    /end-exec                                                         
     C                   endsr 
    Vielleicht kannst Du daraus was erkennen ?!

    Wenn nicht, dann werde ich das SQL aus dem programm rausnehmen und wieder mit der Native-RPG-Methode arbeiten.

    mfg. Ludger

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    Hallo Ludger,

    Cursor, die eine ORDER BY-Anweisung enthalten, sind weder "deleteable" noch "updateable".

    Für den Update kann man sich durch das Hinzufügen von FOR UPDATE OF Feld1, ... Feldn behelfen. Für Delete funktioniert dies nicht.

    Wenn der ORDER BY nicht unbedingt erforderlich ist, dann lass ihn weg. In diesem Fall kann der Satz über DELETE ... WHERE CURRENT OF gelöscht werden.

    Sollte der ORDER BY erforderlich sein, muss der Satz über ein separates SQL-Update-Statement (ohne Bezug auf den Cursor) gelöscht werden. Vorsicht: wenn über relative Satz-Nr. gelöscht werden sollte, wird immer ein Table Scan ausgeführt.

    Der Update kann allerdings auch über native I/O ausgeführt weden.

    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

  5. #5
    Registriert seit
    Jul 2003
    Beiträge
    331
    Vielen Dank für die Untestützung und noch ein schönes
    Restwochenende.

    mfg Ludger

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo,

    das halte ich für ein Gerücht, mit for update Klausel und dynamic scroll geht alles (außer Schmuddel wie Key update); order by ist da kein Hinderungsgrund und positioned delete/update aus Performance Gründen immer vorzuziehen.

    mfg

    Dieter Bender

    Zitat Zitat von B.Hauser
    Hallo Ludger,

    Cursor, die eine ORDER BY-Anweisung enthalten, sind weder "deleteable" noch "updateable".

    Für den Update kann man sich durch das Hinzufügen von FOR UPDATE OF Feld1, ... Feldn behelfen. Für Delete funktioniert dies nicht.

    Wenn der ORDER BY nicht unbedingt erforderlich ist, dann lass ihn weg. In diesem Fall kann der Satz über DELETE ... WHERE CURRENT OF gelöscht werden.

    Sollte der ORDER BY erforderlich sein, muss der Satz über ein separates SQL-Update-Statement (ohne Bezug auf den Cursor) gelöscht werden. Vorsicht: wenn über relative Satz-Nr. gelöscht werden sollte, wird immer ein Table Scan ausgeführt.

    Der Update kann allerdings auch über native I/O ausgeführt weden.

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

  7. #7
    Registriert seit
    Jul 2003
    Beiträge
    331
    Hallo Dieter, nachdem ich das where current of rausgenommen hatte und ausserdem
    noch eine Dateierweiterung vorgenomme hatte, um den Satz eindeutig bestimmen
    zu können, hat es mit dem Löschen funktioniert.
    Was nutzen die schönsten Performance-Zeiten, wenn es nicht geht ?

    mfg. Ludger

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    Zitat Zitat von BenderD
    Hallo,
    das halte ich für ein Gerücht!
    Hallo Dieter,

    Hast Du's ausprobiert?
    Ich schon!

    Wenn ORDER BY angegeben ist, erhält man nach dem DELETE den SQL-Code -510, unabhängig davon ob DYNAMIC SCROLL CURSOR, SCROLL CURSOR oder nur CURSOR angegeben ist.

    Steht übrigens auch so in der SQL-Reference, vielleicht nicht ganz so einfach (doppelt verneint und so!)

    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.247
    Laut Handbuch muss der Cursor als "for update" deklariert werden. Dann spielt Order By bzw. der Cursor-Typ keine Rolle.
    Allerdings sind Join's in solchen Fällen nicht möglich.
    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
    Hallo,

    nicht nur probiert, das ist tägliche Praxis.
    Wenn der update geht, dann geht auch der Delete und die ominöse -510 beschreibt, was zu tun ist. Wenn order By, dann ist for update of Klausel erforderlich und die Angabe eines Feldes genügt (kein ORDER BY Feld, kein primary Key). Wenn scroll, dann dynamic und die üblichen Bedingungen für updatable Cursor müssen ebenfalls stimmen.

    mfg

    Dieter Bender

    Zitat Zitat von B.Hauser
    Hallo Dieter,

    Hast Du's ausprobiert?
    Ich schon!

    Wenn ORDER BY angegeben ist, erhält man nach dem DELETE den SQL-Code -510, unabhängig davon ob DYNAMIC SCROLL CURSOR, SCROLL CURSOR oder nur CURSOR angegeben ist.

    Steht übrigens auch so in der SQL-Reference, vielleicht nicht ganz so einfach (doppelt verneint und so!)

    Birgitta
    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. Embedded SQL in VARPG
    By Squall in forum NEWSboard Programmierung
    Antworten: 23
    Letzter Beitrag: 18-10-06, 12:01
  2. embedded SQL in RPG
    By muadeep in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 03-08-06, 13:25
  3. RPG mit Embedded SQL, JOIN ..
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 18-06-06, 12:14
  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
  •