PDA

View Full Version : embedded SQL Cursor with Hold und Commit/Rollback



steffenboehme
15-06-21, 12:26
Hallo zusammen,

ich bräuchte mal etwas Fachexpertise zum Thema Commitsteuerung und RPGLE / SQLRPG.

Ich habe ein steuerndes Programm und Commit=*CS mit Cursor with hold - Definitionen.
Während dieser Cursor durchlaufen wird, wird ein zweites Programm aufgerufen, dass ebenfalls unter Commit = *CS . Solange das zweite Programm den Commit erfolgreich durchführen kann ist alles schöne und mein Cursor aus dem ersten Programm läuft weiter und arbeitet den nächsten Satz ab.
Fällt das zweite Programm aber auf die Nase und ein Rollback wird ausgeführt, werden alle Cursor geschlossen - auch die aus dem steuernden Programm.
Hab ich eine Möglichkeit das zu verhindern bzw. wie würde ich im steuernden Programm wieder auf meinen cursor an genau dieser Stelle zugreifen könne?

Hier mal vereinfacht der Ablauf...

PGM1
...
Declare cursor c1 with hold
Open c1
If SQLCODE =0
DOU ...
fetch next c1
If SQLCODE=0
CALL PGM2
EndIf
ENDDO
...
EndPGM

vielen Dank für Eure Hilfe

Robi
15-06-21, 12:30
Aktivationgroup ist dein Freund.
Pgm A sollte eine andere als Pgm B haben

bei der Umwandlung kannst eine angeben und die Tragweite des Close auf diese Actgrp beschränken.

Fuerchau
15-06-21, 15:42
Ja aber: Activation-Groups erstellen auch getrennte Transaktionen. Das aufgerufene Programm muss also seinen eigenen Commit/Rollback durchführen. Wenn es das nämlich vergisst, war alles für die Katz'.

Allerdings musst du da etwas durcheinander bringen.
Ein Cursor "with Hold" wird beim Rollback eben nicht zurückkgesetzt.

https://www.google.com/search?client=firefox-b-d&q=ibm+i+cursor+with+hold

steffenboehme
18-06-21, 08:25
Danke für die Infos.
Der Cursor "with hold" wird bei Rollback geschlossen und das ist mein Problem, da er offen bleiben muß für die weiteren Verarbeitungen.
Wenn das nur mit getrennten Aktivierungsgruppen geht, haben wir in unserer Anwendung was zu tun, da wir immer dftactgrp(*no) actgrp(*caller) in den CTL-OPT implemetiert haben.
Oder gibts da noch was anderes?

B.Hauser
18-06-21, 09:08
Setz beim SQL Commit und Rollback WORK HOLD dahinter:


Exec SQL Commit Work Hold;

oder versuch statt des SQL Commit und Rollback den RPG Commit und Rolbk zu verwenden

Birgitta

BenderD
18-06-21, 09:14
... das mit der ACTGRP ist eh keine gute Idee. Man hat einen Commit Master, das ist der, der die Transaktion steuert und alle slaves sind *CALLER. Das HOLD beim Cursor wirkt nur beim Commit, beim Rollback muss zusätzlich nochmals hold angegeben werden. Das ist zwar kein ANSI, sondern DB2 Erweiterung, sollte aber funzen (sonst ist mit den PTFs was faul).

D*B

Fuerchau
18-06-21, 09:16
Nur mal ne blöde Frage:
Bist du sicher, dass der Cursor in der Programmkette eindeutig ist?
Wenn der selbe Cursorname wieder verwendet wird, scheitert der Open aber der Close nicht.
Im Debugmodus solltes du da Hinweise finden können.

B.Hauser
18-06-21, 09:42
Ein Cursor-Name muss eindeutig innerhalb einer Quelle/Moduls sein! Außerhalb des Moduls kann der gleiche Cursor-Name wieder verwendet werden, unabhängig davon ob das Programm/Modul/Prozedur in der gleichen Programm-Kette aufgerufen wird.