3

プロシージャのリストをループして動的に呼び出す Oracle パッケージがあります。各プロシージャ コールの前に SAVEPOINT が作成され、例外が発生した場合は、ロールバックが発行され、問題がログに記録されます。最近、動的プロシージャの 1 つに COMMIT が追加されたバグが発生しました。これがトリガーされると、SAVEPOINT が無効になります。その後、同じ手順が失敗し (例外が発生し)、呼び出し元のパッケージの例外ハンドラーがロールバックを試みた場合、例外ハンドラー ブロック内で次の例外が発生します。

ORA-01086: savepoint 'EXAMPLE_SAVEPOINT' never established in this session or is invalid

ここで、例外ハンドラーに別の例外ハンドラーを配置して、この特定の例外を処理することができますが、SAVEPOINT を発行しようとする直前に、それが有効かどうかを確認するために SAVEPOINT をすばやくチェックできれば、はるかにうまくいきます。ロールバック。これは可能ですか?

4

1 に答える 1

2

あなたはそれを忘れなければならないと思います。ごめん。誰かが 2013 年 4 月に Tom Kyte にこの質問をしたとき、彼の答えは:

2) オラクルは、作成したセーブポイントをどこで追跡しますか?また、作成されたセーブポイントに対して SCN が作成されていますか?

そして私たちは言った...

...

2) セーブポイントは、概念的には元に戻すストリームへのポインタです。そのための SCN は必要ありません。元に戻すストリームのどこまでロールバックするかを知る必要があるだけです。

Jonathan LewisBurlesonも、データ ディクショナリのどこにも保存されているとは考えていません。Workspace Managerを使用している場合、または復元ポイントを使用したい場合、データはそれぞれALL_WM_MODIFIED_TABLESV$RESTORE_POINTに保存されますが、これはやり過ぎのようです。

于 2013-11-04T13:31:40.437 に答える