プログラミング言語や環境設定を中心としたパソコン関連の技術メモです。
主にシステム開発中に調べたことをメモしています。TIPS的な位置付けで、気が向いたときにちまちま更新していきます。
Oracle、フェッチ・アクロス・コミット(fetch across commit)とは。
ストアドなんかで、selectカーソルをぐるぐる回して
その中でCOMMITとかする処理のことをそう呼ぶみたいです。

  FOR REC_TABLE1 IN (SELECT HOGE_ID, HOGE_NAME FROM TABLE1 WHERE DEL_FLG = '0')
  LOOP
      DBMS_TRANSACTION.USE_ROLLBACK_SEGMENT('専用ロールバックセグメント');
  
      UPDATE 
          TABLE1 
      SET 
          HOGE_NAME = 'hogehoge'  
      WHERE 
          HOGE_ID = REC_TABLE1.HOGE_ID;
  
      --commit
      COMMIT;
  
  END LOOP;


とか、こんな書き方ですね。
問題が起きやすいからやらない方が良いみたいですよ。
ORA-1555が発生する原因になったりするんですってさ。

専門的なことはここを参考にさせていただきましたφ(--)

■フェッチ・アクロス・コミット (fetch across commit) 処理
 http://www.shift-the-oracle.com/plsql/fetch-across-commit.html

■ORA-01555: スナップショットが古すぎます:
 http://www.shift-the-oracle.com/oerrs/ora-01555.html


じゃーどーすんべ(--?

仕方ないのでcollectionの結合配列使って誤魔化すことにしました。
最初に検索結果の値を退避しておいてあとでまとめて更新。
こんな感じφ(--)

  --変数宣言
  TYPE ARY_HOGE_ID IS TABLE OF VARCHAR2(20) INDEX BY BINARY_INTEGER;
  L_ARY_HOGE_ID                ARY_HOGE_ID;    --退避用変数
  L_NUM                        NUMBER(6) := 0;    --カウント用変数

  L_NUM := 0;

  --値退避
  FOR REC_TABLE1 IN (SELECT HOGE_ID, HOGE_NAME FROM TABLE1 WHERE DEL_FLG = '0')
  LOOP

      --必要な値を退避
      L_ARY_HOGE_ID(L_NUM) = REC_TABLE1.HOGE_ID;

      --カウントアップ
      L_NUM := L_NUM + 1;

  END LOOP;

  --更新
  IF L_NUM > 0 THEN
      FOR I IN 0..L_NUM-1 LOOP
  
          --update
          UPDATE 
              TABLE1 
          SET 
              HOGE_NAME = 'hogehoge'  
          WHERE 
              HOGE_ID = L_ARY_ITEMID(I);
  
          --commit
          COMMIT;
  
      END LOOP;
  END IF;




これで大丈夫だべか(--?
スポンサーリンク
 
このエントリーをはてなブックマークに追加 

category:● Oracle  thema:システム開発 - genre:コンピュータ  Posted by ササキマコト 

  関連記事