[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    May 2004
    Beiträge
    455

    SQL ROLLBACK im embedded SQL mit SQL Prozeduraufruf

    Hallo zusammen,

    ich rufe eine SQL Prozedur auf welche einen INSERT von einer Datei in eine andere Datei macht.
    Diese SQL Prozedur wird aus dem RPG mehrfach in einer Schleife aufgerufen.
    Wenn ein Fehlerfall eintritt mache ich einen execute sql rollback.
    Aber der Rollback löscht die vorherigen Sätze nicht.

    Ich denke das Problem hängt mit der SQL Prozedur zusammen.
    Muss ich in der Prozedur was angeben, dass die Sätze unter COMMIT laufen?

    Vielen Dank

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.455
    commit = *chg;

    Beachte noch folgendes:
    Bei einem Rollback / Commit wird der aktuelle Cursor geschlossen!
    Man kann den Cursour zwar mit "declare cursor meincursour with hold for" definieren, das hilft aber nur beim Commit. Beim Rollback wird der Cursor dann auch geschlossen.
    Ich behelfe mir dann mit einem Savepoint und einem Rollback to Savepoint retain cursor.
    Dann bleibt beim Rollback der Cursor auch offen.

    Wenn du einen Rollback in der Prozedur machst, hat du keine Chance den Cursor offen zu halten.
    SQL-Prozeduren sollten auch keinen Commit/Rollback machen, sondern die Anwendung, die die Prozedur 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

  3. #3
    Registriert seit
    Nov 2020
    Beiträge
    386
    Bei Commit prüfe ich auch (gerade bei Prozeduren) die ACTGRP.
    Das Commit betrifft alle Änderungen von allen Programmen innerhalb der gleichen ACTGRP.
    Wenn es also eine Prozedur ist, die für sich abgekapselt sein soll, sollte diese in einer eigenen ACTGRP laufen.

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.325
    Zitat Zitat von Fuerchau Beitrag anzeigen
    commit = *chg;

    Beachte noch folgendes:
    Bei einem Rollback / Commit wird der aktuelle Cursor geschlossen!
    Man kann den Cursour zwar mit "declare cursor meincursour with hold for" definieren, das hilft aber nur beim Commit. Beim Rollback wird der Cursor dann auch geschlossen.
    Ich behelfe mir dann mit einem Savepoint und einem Rollback to Savepoint retain cursor.
    Dann bleibt beim Rollback der Cursor auch offen.

    Wenn du einen Rollback in der Prozedur machst, hat du keine Chance den Cursor offen zu halten.
    SQL-Prozeduren sollten auch keinen Commit/Rollback machen, sondern die Anwendung, die die Prozedur verwendet.
    ... beim rollback muss dann ebenfalls hold angegeben werden und (wenn ich das richtig erinnere) muss der cursor for dem fetch next repositioniert werden.

    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/

  5. #5
    Registriert seit
    May 2004
    Beiträge
    455
    Der commit und der rollback werden im RPG gemacht und es wird auch nicht weiter gemacht.

    Schleifenbeginn
    Aufruf der SQL-Prozedur
    Es gibt einen Fehler --> exec sql rollback und Programm verlassen
    Schleifenende
    exec sql commit und Programm verlassen

    Der Rollback wird ausgeführt aber die Daten bleiben weiterhin in der Datei das ist das Problem

    Das aufrufende CL startet mit actgrp(*new)
    Das rpg mit actgrp(*caller)

    Jetzt mal noch ne dumme Frage hahaha. Benötige ich einen STRCMTCTL im CL-Programm wenn ich commit und rollback nur über SQL mache?

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.325
    Zitat Zitat von harkne Beitrag anzeigen
    Der commit und der rollback werden im RPG gemacht und es wird auch nicht weiter gemacht.

    Schleifenbeginn
    Aufruf der SQL-Prozedur
    Es gibt einen Fehler --> exec sql rollback und Programm verlassen
    Schleifenende
    exec sql commit und Programm verlassen

    Der Rollback wird ausgeführt aber die Daten bleiben weiterhin in der Datei das ist das Problem

    Das aufrufende CL startet mit actgrp(*new)
    Das rpg mit actgrp(*caller)

    Jetzt mal noch ne dumme Frage hahaha. Benötige ich einen STRCMTCTL im CL-Programm wenn ich commit und rollback nur über SQL mache?
    ... lass mich raten: Du hast die procedure mit commit level *none erstellt.

    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/

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.455
    Das Programm, dass die Prozedur aufruft, entscheidet über den Commitlevel.
    Die Prozedure erbt i.d.R. vom Aufrufer.

    Prüfe einfach mal, ob du im Programmcode:

    exec sql set option commit = *chg;

    verwendest. Der Default ist leider *none.
    Und wichtig ist natürlich auch, dass die Tabellen in einem Journal aufgezeichnet werden.
    Ohne Jounrnal keine Transaktionen.
    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
    Mar 2002
    Beiträge
    5.325
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Das Programm, dass die Prozedur aufruft, entscheidet über den Commitlevel.
    Die Prozedure erbt i.d.R. vom Aufrufer.

    Prüfe einfach mal, ob du im Programmcode:

    exec sql set option commit = *chg;

    verwendest. Der Default ist leider *none.
    Und wichtig ist natürlich auch, dass die Tabellen in einem Journal aufgezeichnet werden.
    Ohne Jounrnal keine Transaktionen.
    ... es geht wieder einmal alles durcheinander:
    - default bei SQL ist commit *chg (wird aber von Dilettanten oft auf *none geändert)
    - SQL Procedures und Functions erben das commit level aus der Erstellungsumgebung. Profis schreiben das SQL Statement in eine SRCPF und erstellen die Procedure/Function mit RUNSQLSTM ohne verhunzte defaults und dann passt das.
    - Versuche commit ohne Journal zu starten enden zum Glück ohne Schaden anzurichten - nämlich sofort.

    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/

  9. #9
    Registriert seit
    May 2004
    Beiträge
    455
    Hallo, ja aber ich war schneller haha
    Die Prozeduren hatten COMMIT = *NONE.
    Ich entschuldige mich damit, dass ich die Prozeduren nicht gemacht habe. hahaha
    Aber ja, das war das Problem.
    Vielen Dank für die Hilfe

Similar Threads

  1. Probleme mit EXECUTE ROLLBACK in embedded SQL
    By harkne in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 16-10-23, 10:27
  2. embedded SQL Cursor with Hold und Commit/Rollback
    By steffenboehme in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 18-06-21, 09:42
  3. Prozeduraufruf mit *OMIT-Parameter fehlerhaft
    By Fuerchau in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 21-05-20, 18:30
  4. Commit und Rollback bzw. nicht Rollback
    By wti in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 14-05-17, 13:13
  5. Prozeduraufruf aus SQL-Trigger
    By Schorsch in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 29-04-05, 08:31

Berechtigungen

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