ストアドプロシージャからログテーブルに書き込む必要があります。 このログ情報は、ロールバック・オフコースを乗り越えなければなりません。現在のトランザクション外でトランザクションをコミットします(Oracleの自律型トランザクションなど)
私はこの質問が以前に尋ねられたことは知っていますが、私の状況は異なり、私はこれらの質問で私の問題に対する答えを見つけることができません。
ストアドプロシージャにエラーがない場合は簡単ですが、ログテーブルのエントリはそこにあります。
複雑なものよりもエラーがある場合。
手順の中で、キャッチでロールバックを行い、データをログテーブルに挿入することができます。私はそれを知っており、すでにそれを行っています。
は、しかし、問題は、ストアドプロシージャは、次のように呼び出されたときです。
begin transaction
exec myStoredProcedure
rollback transaction
select * from myLogTable
私はそれがmimimal私の問題を示すために保たれ、このコードはあまり意味があります知っています。
ストアドプロシージャの呼び出し元がコミット/ロールバックを実行する場合、ストアドプロシージャでの処理は重要ではありません。私のログは常にロールバックされます。
私はログを記録したいデータを返す一時テーブルトリックを使用することはできません。呼び出し元が外部アプリケーションであるため、呼び出し元がロールバックを行った後にそのデータをログテーブルに挿入できるようにします私には源泉がありません。
ロギングは、1行のコードしか持たない別個の手順で実行されます。ログ・テーブルへの挿入です。
私が必要とするのは、現行のトランザクション外で、このプロシージャーで挿入をコミットする方法です。
これを行う方法はありますか?
ソリューション:
私はlad2025
答えを使用して、これまでそれが問題やパフォーマンス上の問題もなく働いています。
しかし、この手順は毎日約1000回しか呼び出されませんが、あまり問題はないと思います。
これは非常に興味深いようです。 DBをオフラインにせずにエクステンションパックをインストールできますか?それはパフォーマンスに影響しますか?後者は重要です。なぜなら、ロギングはオフコースで起こるからです。 – GuidoG
@GuidoGのインストールは非常に簡単で、一連のスクリプトを実行します(マスターDBには多くのストアドプロシージャ/タイプがあります)。私はパフォーマンスをテストしません(私はDEV/QA envで試してみることをお勧めします)。多くのテストを行います。 – lad2025
OKこれで感謝します – GuidoG