PL/SQL引擎会向SQL引擎发送SQL语句,后者会向PL/SQL引擎返回结果。PL/SQL和SQL引擎之间的通信称为上下文切换。这种上下文存在一定的性能负载。PL/SQL有大量的特性,可以降低这种性能负载,其中之一就是批量SQL(Bulk SQL)。如果某SQL语句影响4行或者更多的数据,使用批量SQL一般能提升性能。批量SQL支持SQL语句及其结果的批量处理。它有两个特性:FORALL语句和BULKCOLLECT子句。
一、FORALL语句
FORALL语句会从PL/SQL引擎向SQL引擎批量发送INSERT、UPDATE、或者DELETE语句,而不每次发送一条语句
如下FOR循环会10次迭代执行INSERT语句:
FOR i IN 1..10 LOOP
INSERT INTO table_name
VALUES(......);
END LOOP;
该INSERT语句会从PL/SQL炸群发送到SQL引擎10次,也就是说会发生10次上下文切换。如果使用FORALL语句替换这个FOR循环,只需要发送一次INSERT语句,但是会执行10次。在这种情况下,在PL/SQL和SQL之间只会发生一次上下文切换。
FORALL语句具有如下结构:
FORALL loop_counter IN bounds_clause
SQL_STATEMENT [SAVE EXCEPTIONS];
--其中,bounds_clause(边界子句)是下面形式之一:
lower_limit...upper_limit
INDICES OF collection_name BETWEEN lower_limit..upper_limit
VALUES OF collection_name
FORALL实例:
-- 建一张表
CREATE TABLE test (t_num NUMBER,t_text VARCHAR2(10));
DECLARE
--PLS_INTEGER是PLSQL环境中的一个特殊的数字类型,
--这种类型的值是通过硬件平台原生整数格式来表示的
TYPE t_num_type IS TABLE OF NUMBER INDEX BY PLS_INTEGER;
TYPE t_text_type IS TABLE OF VARCHAR2(10) INDEX BY PLS_INTEGER;
t_num_tab t_num_type;
t_text_tab t_text_type;
v_total NUMBER;
BEGIN
FOR i IN 1..10 LOOP
t_num_tab(i) := i;
t_text_tab(i) := 'row'||i;
END LOOP;
FORALL i IN 1..10</