[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    Feb 2009
    Beiträge
    16

    Exception Handling bei Satzsperre in SQLRPGLE

    Hallo,

    ich habe mal eine etwas ungewöhnliche Frage. Hierzu muss ich jetzt mit der Erklärung etwas ausholen:

    Bei den Std. RPG File-Zugriffsmethoden (z.B. CHAIN) bekomme ich ja einen Fehler, wenn ich auf einen bereits gesperrten Satz versuche zuzugreifen. Diese Fehlermeldung kann ich über die PSDS (Program Status Data Structure) an Stelle 91 bis 170. Hier steht dann zum Beispiel "Satz 36 wird von Job 178679/xxx/yyy benutzt." (xxx = Benutzer yyy = Sitzung). Diese Meldung und die interne Telefonnummer des Benutzers (welcher den Satz sperrt) gebe ich dann als Fehlermeldung dem anderen Benutzer (wo versucht auf den Satz zuzugreifen) aus. Soviel zur schönen Classic-RPG-Welt.

    Jetzt habe ich ein SQLRPGLE Programm wo ich über SQL - Abfragen auf Sätze in Dateien zugreife und später update. Hierzu habe ich einen DYNAMIC SCROLL CURSOR declariert. Wenn ich nun mit FETCH einen Bereits gesperrten Satz versuche zu lesen, bekomme ich den SQLCODE -913 (Satzsperre). Soweit so gut ... jedoch ist die SDSMSG (PSDS Stelle 91 bis 170) leer . Somit scheint an dieser Stelle für die PSDS keine exception oder error vorzuliegen . Jedoch im JobLog steht an dieser Stelle meine ersehnte Fehlermeldung.

    Gibt es eine Möglichkeit, dass sich die PSDS auch bei SQL-Zugriffsfehlern füllt?

    Oder mach ich da nur etwas falsch?

    Vorab schon mal vielen Dank!

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    SQL kennt die SDS gar nicht.
    Wenn du dir aber die Spoolfile mal ansiehst, erkennst du eine Struktur SQLCA.
    Im Feld SQLERM stehen die Daten zum SQLCOD. Ob aber SQL so ins Detail geht, wie benötigt weiß ich nicht.
    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

  3. #3
    Registriert seit
    Feb 2009
    Beiträge
    16
    Diese Antwort habe ich schon fast befürchtet . Die Informationen in der Struktur SQLCA sind leider nicht so aussagekräftig. Es steht in der SQLERM eigentlich nur die Lib und die Datei.

    Für mich wichtig wäre der User wo den Satz gerade im zugriff hat.

    Trotzdem vielen Dank für die Info zum SDS.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Da hilft dir wohl leider nur ein Serviceprogramm, in dem du den normalen Zugriff auf die Datei kapselst um im Fehlerfall die Sperre abzufragen, was allerdings durch die Zeitverzögerung ggf. negativ beantwortet würde.
    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
    Aug 2003
    Beiträge
    1.508
    Hallo Albrecht_Ch,

    es gibt eine recht mächtige funktion in SQL (Get Diagnostics).
    mit diesem tool, kannst du alle möglichen informationen zu deinem letzten (oder die letzten) sql-aufrufe holen.

    Code:
    D vsqlstt         S             512A
    /Free
      Exec Sql Get Diagnostics CONDITION 1
            :vsqlstt = MESSAGE_TEXT;    
      dsply (sqlstt);                     
    /End-Free
    es gibt 2 sehr gute handbücher in denen du auf jedenfall genug informationen finden kannst.

    hoffe es hilft dir weiter!

    System i
    Database
    Embedded SQL programming
    Version 6 Release 1
    5761–SS1

    IBM Systems - iSeriesDB2 for i5/OS SQL Reference Version 5 Release 4
    5722–SS1

    lg andi

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    ... nur leider gibt Get Diagnostics auch nur die Fehlermeldung, dass in der Datei eine Satz-Sperre vorliegt, aber nicht welcher Job bzw. welcher User welchen Satz blockiert.

    Hier sind übrigens die Links zu den Online-Books:
    SQL Reference - Release 6.1
    Embedded SQL Programming - Release 6.1

    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
    Sep 2004
    Beiträge
    129
    Du kannst über die API QGYOLJBL das Joblog auslesen und dir die Meldung holen die du brauchst. Leider ist das dann einfach ein ganzer Textstring ohne Variablen.

    Alternativ kannst du bei einem Lock die relative Satznummer auslesen (select rrn(datei) from datei where ) und dann mit der API QDBRRCDL den Benutzer usw. auslesen. Das Ganze dann noch schön in einem Serviceprogramm verpackt und man merkt gar nicht mehr, dass SQL das eigentlich gar nicht kann. ;-)

    MfG
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Wobei der Select RRN ganz schön dauert, da hier grundsätzlich kein Index verwendet wird.
    Eine schnelle und vor allem gute Lösung ist das nicht.

    Was ich mich allerdings frage, wieso der SELECT gesperrte Sätze nicht liest ?
    Einen Fehler gibts eigentlich erst beim UPDATE/DELETE oder der gesperrte Satz wird einfach überlesen.
    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 2004
    Beiträge
    129
    So schnell wie im RPG ist das natürlich nicht, man kann aber beim declare cursor gleich die relative Satznummer mit auslesen, dann erspart man sich das nachher. Obwohl ich eingentlich nicht so viele Locks erwarte dass es zeitlich ein Problem wird die relative Satznummer auszulesen.
    Glaube das Überlesen von gelockten Sätzen funktioniert erst bei V6.1, kann mich aber täuschen.
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Das Überlesen ist ja nicht das Problem.
    Ich kann durchaus gesperrte Sätze lesen!

    Allerdings darf ich den Cursor nicht als "for update" deklarieren, da im Falle des Lesens genau dann ein Sperre gesetzt wird und es ggf. zum Fehler kommt.

    SQL-Like ist das nicht.
    MS-Access / ADO.NET geht den "normalen" Weg, dass vor dem Update / Delete die aktuelle Information erst noch mal gelesen und mit dem vorherigen Zustand verglichen wird. Ist der Inhalt noch unverändert, wird geändert an sonsten ein Fehler ausgelöst.

    Dies wäre das korrekte Anwendungsverhalten, denn eine potentielle Satzsperre ohne den tatsächlichen Wunsch einer Veränderung sollte nicht erfolgen.
    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
    Mar 2005
    Beiträge
    74
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Wobei der Select RRN ganz schön dauert, da hier grundsätzlich kein Index verwendet wird. Eine schnelle und vor allem gute Lösung ist das nicht.
    Das Stimmt nicht, Indexe werden auch zur Ermittlung von RRN() verwendet.

  12. #12
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Wenn du einen
    select ... where rrn() = 1234
    verwendest, kann SQL keinen Index verwenden, da es keinen Index über RRN gibt.
    Schränkst du natürlich auf weitere Schlüssel ein, werden für diese natürlich Indizees verwendet.
    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. Anzeigervariable im SQLRPGLE
    By Jenne in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 06-06-07, 10:10
  2. CPYF Fehler handling
    By RLPforum in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 05-07-06, 14:04
  3. sqlrpgle
    By guru30 in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 22-02-06, 14:53
  4. SQLRPGLE
    By mk in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 17-11-05, 09:48
  5. *zoned bei SQLRPGLE Programm
    By Stefan_Sk in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 12-07-05, 13:04

Berechtigungen

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