2016-11-07 14 views
0

コードブロックに時間がかかり、処理が更新されるテーブルに進捗変数が作成されているため、完了までにどれくらいの時間がかかります。セーブポイントとコミットとの競合

コードブロックはアトミックトランザクションとして扱われるので、commitステートメントを使用しない限り、進捗変数の値は0%または100%しか表示されません。これにより、前のポイントで宣言されたセーブポイントが削除されます。ブロックが発生し、例外が発生した場合は有効ではないと認識されます。

のコードは次のようなものです:

begin 
    /*do some stuff*/ 
    savepoint p_savepoint; 
    for q in (somequery) loop /*Really long loop*/ 
      /*Do some other stuff*/ 
      update t_sys_state set p1_progress = percentage 
      where user_id = 'theuserid'; 
      commit; /*This commit make the real progress value available*/ 
    end loop; 
    exception 
      when others then 
        rollback to p_savepoint; /*This savepoint is not recognized because of the previous commit*/ 
        raise; 
end; 

は、この周りに方法はありますか?

+4

あなただけのあなたが、 '五$ session_longops'にその情報を入れて見ることができますどの代わりdbms_application_info''使用して検討する必要がありますあなたのループの進行状況を表示したい場合例えばここで:http://stackoverflow.com/a/40154203/330315 –

+0

@a_horse_with_no_nameありがとう、私は明日それを試してみます。 – Typo

答えて

3

自律型トランザクションの進捗状況を更新したいと思うようです。これは、自律型トランザクションを使用することが理にかなっている非常にごくわずかな状況の1つです。

CREATE OR REPLACE PROCEDURE log_progress(p_user IN varchar2, 
              p_percentage IN number) 
AS 
    PRAGMA autonomous_transaction; 
BEGIN 
    UPDATE t_sys_state 
    SET p1_progress = p_percentage 
    WHERE user_id  = p_user; 
    commit; 
END; 

、その後

begin 
    /*do some stuff*/ 
    savepoint p_savepoint; 
    for q in (somequery) loop /*Really long loop*/ 
      /*Do some other stuff*/ 
      log_progress('theuserid', percentage); 
    end loop; 
    exception 
      when others then 
        rollback to p_savepoint; /*This savepoint is not recognized because of the previous commit*/ 
        raise; 
end; 
+0

いいね、明日仕事で試してみるよ、ありがとう。 – Typo