私は Oracle PL/SQL を初めて使用し、C# を使用する SQL Server から、アプリケーションの複数のレイヤーに PL/SQL を使用する Oracle カスタム Web アプリケーションに調整しようとしています。
現在、トランザクションのロールバックで問題が発生しています。私は再利用可能なコードを書くことに慣れているので、これらのクラス内のパッケージとメソッドを使用して PL/SQL コードを作成しました。私の更新手順は最初に検証を完了し、正常に検証された場合、一連のさまざまなパッケージ メソッドを呼び出して保存を完了します。残念ながら、更新手順の EXCEPTION 部分でのロールバックでは、Rollback 関数が呼び出されたときにすべてがロールバックされるわけではありません。なぜこれをしているのか、私は途方に暮れています。私の基本的なコード(法的な問題により正確ではありませんが)は次のとおりです。
PROCEDURE SaveApplicationData(
variableName IN VARCHAR2 DEFAULT NULL,
--...
seq_id OUT INT )
AS
BEGIN
SET TRANSACTION NAME 'Transaction Name';
--Save initial program record
SaveNewRecord(variableName, seq_id);
IF (seq_id != 0) THEN
--If saved successfully, seq_id represents record ID
package_class.secondarySaveMethod(variableName, seq_id);
second_package_class.anotherSaveMethod(variableName, seq_id);
END IF;
COMMIT;
htp.p('Sequence ID: ' || seq_id);
htp.p('Saved the record"' || programName || '" successfully!');
EXCEPTION
WHEN OTHERS THEN
utilityPackage.rollbacktransaction;
END SaveApplicationData;
utilityPackage.rollbacktransaction には、ROLLBACK と、組織で使用されるカスタム エラー例外処理パッケージが含まれています。
基本的に、エラーの原因となったセクションがロールバックされますが、セクションがロールバックされるとすぐに、残りのトランザクションが続行されます (以前に実行されたコード ブロックはロールバックされません)。
これが意味をなさない場合はお知らせください。ご協力いただきありがとうございます。