- ベストアンサー
PLSQlでのロールバック
以下の様な処理をしたいのですがうまくいきません。 ・カーソルc_infoで取得した人数分、処理を行いたい。 ・ある1人が異常終了した場合は、その人の処理を全てロールバック した後、次の人に進む。 begin for r_info in c_info loop begin 処理A 処理B 処理C exception rollback; end; end loop exception end; こういう風に組んだのですが、 ある一人が処理Cで異常終了した時、その人の処理A,処理B がコミットされてしまっています。 どのようにすればよいでしょうか? ご教授ください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>>セーブポイントを設けてこのように既にやってみましたが 結果は同じでした。 何でしょうね?トランザクション処理対象外のDDL文が処理A-Cに含まれてはいないですよね? あとは、消去法ってことで、処理AーCの処理をすこしずつ減らし、raiseで例外を発生させて、どこまでだとrollbackされて、どこを過ぎるとcommitされてしまうか?って絞り込んでゆくのがいいかもしれません。 declare USER_ERR_TEST exception; begin ... if (エラー発生させたいデータ?) then raise USER_ERR_TEST;
その他の回答 (3)
- PED02744
- ベストアンサー率40% (157/390)
処理A/B/Cの各々の中でcommit; が書かれていない限り、 そんな事は起こらないとおもうんですけど。。。 処理A/処理Bの各々がもしプロシージャになっているのなら、 最後でcommit;が入っていないか確認してみてください。
補足
有難うございます。 処理A,B,Cはプロシージャです。 それぞれの中で、APIをコールしているのですが、コミット文は ありませんでした。
- lv4u
- ベストアンサー率27% (1862/6715)
以下のように、SAVEPOINTを使ってみたらどうでしょう? begin for r_info in c_info loop begin SAVEPOINT my_point; -- この時点に戻れるように保存 処理A 処理B 処理C exception ROLLBACK TO my_point; -- 直前のSAVEPOINTに戻る end; end loop exception end;
お礼
有難うございます。 セーブポイントを設けてこのように既にやってみましたが 結果は同じでした。
- olsen_w
- ベストアンサー率50% (2/4)
PL/SQLは長いことやってないのでうろ覚えですが WHEN OTHERS THENっていらないんでしたっけ? これがないと例外に飛ばないような気がするのですが… exception WHEN OTHERS THEN rollback; end;
お礼
有難うございます。 WHEN OTHERS THEN は書いています。 例で漏れてしまいました。すいません。
お礼
有難うございます。 そのようにやってみます。 後、exception の中なのですが when e_user_exxecption then しかなく、 when others then がありませんでした。 これも影響しているのでしょうか? 下であります とかいてしまいすいません