ORACLE批量處理數據之COLLECT BULK INTO 和FORALL的用法


1.PL/SQL塊的執行過程

當ORALCE運行一塊代碼時,PL/SQL引擎將執行過程化的代碼,SQL引擎而將執行SQL語句,因此執行過程中PL/SQL引擎和SQL引擎會不斷切換和交互,稱為上下文交換(context switch)。

2.BULK COLLECT和FORALL特點

  • BULK COLLECT INTO 可以將多個行引入一個或多個集合中,提供對數據的高速檢索。
  • FORALL 可以將多個DML批量發送給SQL引擎來執行,可大大改進INSERT、UPDATE和DELETE操作的性能。

Oracle數據庫使用這些語句大大減少了PL/SQL與SQL語句執行引擎的環境切換次數,從而使其性能有了顯著提高。

3. 批量游標的使用

當需要批量處理大數據量,又要防止出現大事務時。比如需要分批次的更新數據,可使用BUIK COLLECT INTO 和FORALL來提高效率。
如下代碼示例:

declare 
       --定義游標
       cursor c_job
       is
       select empno,ename,job,sal
       from emp
       where job='MANAGER';
       --定義游標變量,
       --v_row c_job%rowtype; 不能再用這種方式定義
       type c_job_type is table of c_job%rowtype;
       v_row c_job_type;
begin
       open c_job;
         loop
           --限制一次提取的數據量(1000)到v_row
           fetch c_job bulk collect into v_row limit 1000;
            --exit when c_job%notfound; 不能用這種方式定義
            exit when v_row.count=0;
            forall i in v_row.first..v_row.last
                update emp_bak a
                  set a.empno = v_row(i).empno,
                      a.ename = v_row(i).ename,
                      a.job = v_row(i).job,
                      a.sal = v_row(i).sal
                where a.job='MANAGER';
            commit;
         end loop;
       --關閉游標
      close c_job;
end;
/

注意:

  • FORALL語句的執行體必須是一個單獨的DML語句,比如INSERT,UPDATE或DELETE
  • FORALL語句不要顯式定義index_row,它被PL/SQL引擎隱式定義為PLS_INTEGER類型
  • BULK COLLECT的批量特性,可以使用LIMIT子句來限制一次提取的數據量。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM