-
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
-
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.
-
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.
-
Zitat von Fuerchau
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
-
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?
-
Zitat von harkne
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
-
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.
-
Zitat von Fuerchau
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
-
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
-
By harkne in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 16-10-23, 10:27
-
By steffenboehme in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 18-06-21, 09:42
-
By Fuerchau in forum NEWSboard Programmierung
Antworten: 6
Letzter Beitrag: 21-05-20, 18:30
-
By wti in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 14-05-17, 13:13
-
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
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks