このトピックでは、PL/SQLでのトランザクション管理について説明します。
概要
CALLコマンドで呼び出されるプロシージャまたはDOコマンドで呼び出される匿名コードブロックでは、COMMITおよびROLLBACKコマンドを使用してトランザクションを終了できます。 上記のコマンドを使用してトランザクションが終了した後、新しいトランザクションが自動的に開始されます。 したがって、別のSTART TRANSACTIONコマンドは存在しません。 PL/SQLでは、BEGINとENDの意味が異なることに注意してください。
次のサンプルコードは簡単な例です。
CREATE PROCEDURE transaction_test1()
IS
BEGIN
FOR i IN 0 .. 9ループ
INSERT INTO test1 (a) VALUES (i);
IF i % 2 = 0 THEN
COMMIT;
ELSE
ROLLBACK;
END IF;
END LOOP;
END;
CALL transaction_test1(); 新しいトランザクションは、デフォルトのトランザクション分離レベルなどのデフォルトの特性で開始されます。 トランザクションがループでコミットされた場合、終了したトランザクションと同じ特性を持つ新しいトランザクションを自動的に開始することができます。 この場合、COMMIT AND CHAINおよびROLLBACK and CHAINコマンドを使用できます。
トランザクション制御は、コマンドを介在させることなく、最上位レベルからのCALLおよびDO呼び出し、またはネストされたCALLおよびDO呼び出しに対してのみ実行できます。 たとえば、呼び出しスタックがCALL proc1() → CALL proc2() → CALL proc3() の場合、第2および第3のプロシージャはトランザクション制御アクションを実行できます。 ただし、呼び出しスタックがCALL proc1() → SELECT func2() → CALL proc3() の場合、最後のプロシージャはSELECTコマンドの間にトランザクション制御を実行できません。
カーソルループには特別な考慮事項が適用されます。 次のサンプルコードに例を示します。
CREATE PROCEDURE transaction_test2()
IS
DECLARE
rレコード;
BEGIN
r IN SELECT * FROM test2 ORDER BY x LOOP
INSERT INTO test1 (a) 値 (r.x);
COMMIT;
END LOOP;
END;
CALL transaction_test2(); トランザクションがコミットされると、カーソルは自動的に閉じられます。 ただし、カーソルがループの一部として作成された場合、最初のCOMMITまたはROLLBACKコマンドによってカーソルが自動的に保持可能なカーソルに変換されます。 この場合、カーソルは行ごとではなく、最初のCOMMITまたはROLLBACKコマンドで完全に評価されます。 カーソルはループの後に自動的に削除されます。 したがって、カーソルはほとんどユーザーには見えません。
トランザクションコマンドは、UPDATEなどの読み取り専用ではないコマンドによって駆動されるカーソルループでは使用できません。 コマンドを返す。
例外ハンドラを含むブロックでトランザクションを終了することはできません。