2017-02-08 12 views
2

この手順では、独自のトランザクション境界内で別のプロシージャをコールし、メイン・トランザクションの失敗またはコミットに関係なくPL/SQLプロシージャをコールする必要があります。つまり、REQUIRES NEWトランザクションの伝播のようなものが必要です。以下のようなOracle PLSQLで個々のトランザクションをコミットする方法

何か:

procedure mainProcedure(arugements) is 
begin 
    // some statements 
    nestedProcedure(someArguments); 
    // some other statements 
end; 

procedure nestedProcedure(arguments) is 
begin 
    // start a new transaction 
    // some statements, lock some objects! 
    // commit the new transaction and release locked objects 
end; 

どのように私はこれを達成することができますか?

答えて

2

あなたはpragma autonomous_transactionを使用することがあります。また、デモ

CREATE TABLE t (
test_value VARCHAR2(25)); 

CREATE OR REPLACE PROCEDURE child_block IS 
PRAGMA AUTONOMOUS_TRANSACTION; 
BEGIN 
    INSERT INTO t 
    (test_value) 
    VALUES 
    ('Child block insert'); 
    COMMIT; 
END child_block; 
/

CREATE OR REPLACE PROCEDURE parent_block IS 

BEGIN 
    INSERT INTO t 
    (test_value) 
    VALUES 
    ('Parent block insert'); 

    child_block; 

    ROLLBACK; 
END parent_block; 
/

実行を参照してください。それはあなたが必要とするのと同じことをします。しかし、サブトランザクションでは、上記の取引からの更新は表示されません。

procedure mainProcedure(arugements) is 
begin 
    // some statements 
    nestedProcedure(someArguments); 
    // some other statements 
end; 

procedure nestedProcedure(arguments) is 
pragma autonomous_transaction; 
begin 
    // start a new transaction 
    // some statements, lock some objects! 
    // commit the new transaction and release locked objects 
    commit; 
end; 
6

Autonomous transationをご覧ください。

-- empty the test table 
    TRUNCATE TABLE t; 

    -- run the parent procedure 
    exec parent_block; 

    -- check the results 
    SELECT * FROM t; 
関連する問題