Oracle巡回標識の4つの方式のまとめ(for、fetch、while、BULK COLLECT)


1.情景展示
Oracleは標識を遍歴する四つの方式(for、fetch、while、bulk collect+forall)
2.問題分析
私たちは旅行標識を表に想像して、遍歴したいなら、旅行標識の各行のデータを取ります。だから問題の鍵はラインデータをどうやって取りますか?
3.ソリューション
方式一:FORサイクル(推奨使用)
変形一:遍歴式の遊標

/*                ,    DECLARE    */
DECLARE
  /*    */
  CURSOR CUR_FIRST_INDEX IS
    SELECT A.ID        A_ID, --    ID
           A.INDEXNAME A_INDEXNAME --      
      FROM INDEX_A A
     ORDER BY A_ID;
  /*      ,           CUR_FIRST_INDEX    */
  ROW_CUR_FIRST_INDEX CUR_FIRST_INDEX%ROWTYPE;
/*    */
BEGIN
  /*      */
  --FOR   
  FOR ROW_CUR_FIRST_INDEX IN CUR_FIRST_INDEX LOOP
    --   
    DBMS_OUTPUT.PUT_LINE('{"ID":"' || ROW_CUR_FIRST_INDEX.A_ID || '","  ":"' || ROW_CUR_FIRST_INDEX.A_INDEXNAME || '"}');
  END LOOP;
END;  
実行、出力結果

変形二:マルチクルーズ(推奨使用)
for循環は周遊標識を遍歴して、実はまた2種類の方式に分けることができて、1種は明示的な遊覧標識の遍歴で、もう1種は陰式の旅行標識の遍歴です。

/*                ,           DECLARE    */
/*    */
BEGIN
  /*      */
  --FOR   
  FOR ROW_CUR_FIRST_INDEX IN (SELECT A.ID        A_ID, --    ID
                                     A.INDEXNAME A_INDEXNAME --      
                                FROM INDEX_A A
                               ORDER BY A_ID) LOOP
    --   
    DBMS_OUTPUT.PUT_LINE('{"ID":"' || ROW_CUR_FIRST_INDEX.A_ID || '","  ":"' || ROW_CUR_FIRST_INDEX.A_INDEXNAME || '"}');
  END LOOP;
END;
暗黙的な游び方は、明示的な游び方よりも简単で、直接的な呼び出しをする必要はありません。    
方式二:FETCHサイクル

/*            ,    ,          */
BEGIN
  /*    */
  --FETCH   
  OPEN CUR_FIRST_INDEX; --             
  LOOP
    FETCH CUR_FIRST_INDEX INTO ROW_CUR_FIRST_INDEX;
    EXIT WHEN CUR_FIRST_INDEX%NOTFOUND;
    --   
    DBMS_OUTPUT.PUT_LINE('{"ID":"' || ROW_CUR_FIRST_INDEX.A_ID || '","  ":"' || ROW_CUR_FIRST_INDEX.A_INDEXNAME || '"}');
  END LOOP;
  CLOSE CUR_FIRST_INDEX;
END;
方式三:WHILE循環

/*            ,    ,          */
BEGIN
  /*    */
  OPEN CUR_FIRST_INDEX; --             
  FETCH CUR_FIRST_INDEX
    INTO ROW_CUR_FIRST_INDEX;
  WHILE CUR_FIRST_INDEX%FOUND LOOP
    --   
    DBMS_OUTPUT.PUT_LINE('{"ID":"' || ROW_CUR_FIRST_INDEX.A_ID || '","  ":"' || ROW_CUR_FIRST_INDEX.A_INDEXNAME || '"}');
    FETCH CUR_FIRST_INDEX
      INTO ROW_CUR_FIRST_INDEX;
  END LOOP;
  CLOSE CUR_FIRST_INDEX;
END;  
注意:whileサイクルを使うにはfetchを2回必要です。
方法4:BULK COLLECT+FOREALL(最速)

/*                ,    DECLARE    */
/*    */
DECLARE
  /*      */
  CURSOR CUR_FIRST_INDEX IS
    SELECT A.ID        A_ID, --    ID
           A.INDEXNAME A_INDEXNAME --      
      FROM INDEX_A A
     ORDER BY A_ID;
  /*     ,         CUR_FIRST_INDEX    (          )*/
  TYPE TABLE_CUR_FIRST_INDEX IS TABLE OF CUR_FIRST_INDEX%ROWTYPE;
  /*      */
  TAB_FIRST_INDEX TABLE_CUR_FIRST_INDEX;
/*      */
BEGIN
  /*    */
  OPEN CUR_FIRST_INDEX;
  LOOP
    -- n         
    FETCH CUR_FIRST_INDEX BULK COLLECT
      INTO TAB_FIRST_INDEX LIMIT 1; --      ,        ,       500   
    --     
    EXIT WHEN TAB_FIRST_INDEX.COUNT = 0;
    --     
    FORALL I IN TAB_FIRST_INDEX.FIRST .. TAB_FIRST_INDEX.LAST LOOP
      DBMS_OUTPUT.PUT_LINE('{"ID":"' || TAB_FIRST_INDEX(I).A_ID || '","  ":"' || TAB_FIRST_INDEX(I).A_INDEXNAME || '"}');
    END LOOP;
  END LOOP;
  CLOSE CUR_FIRST_INDEX;
END;
4.まとめ
  • フォーサイクルを使う利点は、
  • 手動で開いたり閉じたりする必要はありません。
    データを手動で取り込む必要がない(自動的にデータfetchを記録型変数に取り込む)。
    いつ終了するかに注目する必要はありません。つまり終了ループの満足条件を書く必要はありません。
  • 第4の方式は前の3種類と違います。
  • です。
    前三種の遊標変数:ROW_CUR_FIRST_INDEXは、ラベルのデータしか保存できません。
    第四種類の表変数:TAB_FIRST_INDEXは、ラベルの複数のデータを記憶することができます。
    ビッグデータを大量に処理する場合、第4の方式のメリットが浮き彫りになります。
    本文の作者:Marydon
    リンク:https://www.cnblogs.com/Marydon20170307/p/12869692.html
    以上はOracleが巡回している四つの方式のまとめ(for、fetch、while、BULK COLLECT)の詳細です。Oracleが巡回していることについての資料は他の関連記事に注目してください。