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子句來限制一次提取的數據量。