Oracle 10g では、操作 (挿入、選択、更新、削除) ごとにテーブルごとに 1 つのストアド プロシージャがあります。実際には、操作ごとにテーブルごとに複数のプロシージャが存在する可能性があります。たとえば、select の場合は、SelectList、SelectOneRecord、Search (動的クエリを使用) です。
これらのプロシージャにはトランザクションはありません。
1 つのトランザクションで複数の操作を組み合わせる必要がある場合があります。たとえば、あるテーブルへの挿入と別のテーブルへの更新を、すべて 1 つのトランザクションで行います。このために、トランザクションを持つ別の手順を作成します。次に、このプロシージャは 2 つのプロシージャを呼び出します。
上記の単一トランザクション内のプロシージャー呼び出しの組み合わせを有効にするために、上記で説明したように、トランザクション動作をプロシージャーに入れません。
ほとんどの場合、1 つのテーブルへの挿入など、1 つの操作のみを実行する必要があります。挿入プロシージャにはトランザクション動作がないため、トランザクション動作を持つ別のプロシージャを作成し、そのプロシージャが挿入プロシージャを呼び出す必要があります。
最終的には、多くの基本的な手順 (1 つのテーブル、1 つの操作) と、基本的に基本的な手順のラッパーである多くのトランザクション プロシージャが作成されます。
私の質問は、基本的な手順で条件付きのトランザクション動作を行う方法があるかどうかです。これは、トランザクション ロジックを配置できる if 条件を意味し、渡したパラメータに基づいてトランザクションの動作をオンまたはオフにすることができます。次に、テーブルへの挿入など、操作を 1 つだけ実行したい場合は、トランザクション動作を使用して基本的な手順を呼び出します。また、1 つのトランザクションで 1 つのテーブルに挿入し、別のテーブルに更新するなど、1 つのトランザクションで 2 つのプロシージャを呼び出したい場合は、別のトランザクション プロシージャを作成し、トランザクション動作なしで 2 つの基本的なプロシージャを呼び出します。
以下は、別のプロシージャを呼び出してトランザクションでラップするトランザクション プロシージャです。
BEGIN
SAVEPOINT the_start;
BasicProcedure(<list of parameters>);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
BEGIN
ROLLBACK TO the_start;
RAISE;
END;
END;
セーブポイント行とコミット行を if ステートメントに入れることはできますが、例外ブロックを if ステートメントに入れることもできます。例外ブロックを if ステートメントに入れる必要がありますか? プロシージャで例外をキャッチすると、例外が発生したときに自動的にロールバックされますか?