批量SQL之FORALL 语句
转自:http://blog.csdn.net/leshami/article/details/7536926
对PL/SQL而言,任何的PL/SQL块或者子程序都是PL/SQL引擎来处理,而其中包含的SQL语句则由PL/SQL引擎发送SQL语句转交到SQL引擎来处
理,SQL引擎处理完毕后向PL/SQL引擎返回数据。
Pl/SQL引擎与SQL引擎之间的通信则称之为上下文切换。过多的上下文切换将带来过量的性能负载。
因此为减少性能负载的FORALL与BULK COLLECT的子句应运而生。
即仅仅使用一次切换多次执行来降低上下文切换次数。本文主要描述FORALL子句。
一、FORALL语法描述
FORALL loop_counter IN bounds_clause
-->注意FORALL块内不需要使用loop, end loop
SQL_STATEMENT [SAVE EXCEPTIONS];
bounds_clause的形式
lower_limit .. upper_limit
-->指明循环计数器的上限和下限,与for循环类似
INDICES OF collection_name BETWEEN lower_limit .. upper_limit
-->引用特定集合元素的下标(该集合可能为稀疏)
VALUES OF colletion_name
-->引用特定集合元素的值
SQL_STATEMENT部分:SQL_STATEMENT部分必须是一个或者多个集合的静态或者动态的DML(insert,update,delete)语句。
SAVE EXCEPTIONS部分:对于SQL_STATEMENT部分导致的异常使用SAVE EXCEPTIONS来保证异常存在时语句仍然能够继续执行。
二、使用 FORALL 代替 FOR 循环提高性能
-->下面的示例使用了FOR循环与FORALL循环操作进行对比,使用FORALL完成同样的功能,性能明显提高
CREATE TABLE t
(
col_num
NUMBER
,col_var
VARCHAR2( 10 )
);
DECLARE
TYPE col_num_type IS TABLE OF NUMBER
-->声明了两个联合数组
INDEX BY PLS_INTEGER;
TYPE col_var_type IS TABLE OF VARCHAR2( 10 )
INDEX BY PLS_INTEGER;
col_num_tab
col_num_type;
col_var_tab
col_var_type;
v_start_time
INTEGER;
v_end_time
INTEGER;
BEGIN
FOR i IN 1 .. 5000
转自:http://blog.csdn.net/leshami/article/details/7536926
对PL/SQL而言,任何的PL/SQL块或者子程序都是PL/SQL引擎来处理,而其中包含的SQL语句则由PL/SQL引擎发送SQL语句转交到SQL引擎来处
理,SQL引擎处理完毕后向PL/SQL引擎返回数据。
Pl/SQL引擎与SQL引擎之间的通信则称之为上下文切换。过多的上下文切换将带来过量的性能负载。
因此为减少性能负载的FORALL与BULK COLLECT的子句应运而生。
即仅仅使用一次切换多次执行来降低上下文切换次数。本文主要描述FORALL子句。
一、FORALL语法描述
二、使用 FORALL 代替 FOR 循环提高性能
-->下面的示例使用了FOR循环与FORALL循环操作进行对比,使用FORALL完成同样的功能,性能明显提高
CREATE TABLE t
(
);
DECLARE
BEGIN