• ベストアンサー

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 がコミットされてしまっています。 どのようにすればよいでしょうか? ご教授ください。

質問者が選んだベストアンサー

  • ベストアンサー
  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.4

>>セーブポイントを設けてこのように既にやってみましたが 結果は同じでした。 何でしょうね?トランザクション処理対象外のDDL文が処理A-Cに含まれてはいないですよね? あとは、消去法ってことで、処理AーCの処理をすこしずつ減らし、raiseで例外を発生させて、どこまでだとrollbackされて、どこを過ぎるとcommitされてしまうか?って絞り込んでゆくのがいいかもしれません。 declare USER_ERR_TEST exception; begin ... if (エラー発生させたいデータ?) then raise USER_ERR_TEST;

-Rena-
質問者

お礼

有難うございます。 そのようにやってみます。 後、exception の中なのですが when e_user_exxecption then しかなく、 when others then がありませんでした。 これも影響しているのでしょうか? 下であります とかいてしまいすいません

その他の回答 (3)

  • PED02744
  • ベストアンサー率40% (157/390)
回答No.3

処理A/B/Cの各々の中でcommit; が書かれていない限り、 そんな事は起こらないとおもうんですけど。。。 処理A/処理Bの各々がもしプロシージャになっているのなら、 最後でcommit;が入っていないか確認してみてください。

-Rena-
質問者

補足

有難うございます。 処理A,B,Cはプロシージャです。 それぞれの中で、APIをコールしているのですが、コミット文は ありませんでした。

  • lv4u
  • ベストアンサー率27% (1862/6715)
回答No.2

以下のように、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;

-Rena-
質問者

お礼

有難うございます。 セーブポイントを設けてこのように既にやってみましたが 結果は同じでした。

  • olsen_w
  • ベストアンサー率50% (2/4)
回答No.1

PL/SQLは長いことやってないのでうろ覚えですが WHEN OTHERS THENっていらないんでしたっけ? これがないと例外に飛ばないような気がするのですが… exception WHEN OTHERS THEN   rollback; end;

-Rena-
質問者

お礼

有難うございます。 WHEN OTHERS THEN は書いています。 例で漏れてしまいました。すいません。

関連するQ&A