无论是BULK COLLECT还是FORALL,都是通过批量绑定给变量赋值。也就是说,它们是以一个完整的集合(如,<wbr></wbr>varray数组, 嵌套表 ,PL/SQL索引表<wbr></wbr>)为单位(一批一批的)向前或者向后绑定变量。在使用传统的DML语句的时候,每个SQL<wbr></wbr>语句的执行需要在PL/SQL<wbr></wbr>和SQL<wbr></wbr>引擎之前切换上下文,使用批量绑定变量后,就只需要一次上下文切换。<wbr></wbr>
在演示BULK COLLECT之前,首先介绍相关知识:PL/SQL表。<wbr></wbr>
PL/SQL表是在PL/SQL很早的版本就已经存在了的一种特殊的表。之所以说它特殊,是因为它更象一个一维数组。它是一张N行1列的表,它的行号类似一维数组的下标,但和一维数组比起来,首先PL/SQL表的索引也即是行号可以任意指定一个为整数的值,甚至为负数也可以。而将它看成是一个一维数组的话,它是稀疏的,没有固定长度的,可以动态扩展的。它只能在PL/SQL里使用。<wbr></wbr>
声明一个PL/SQL表的语法:<wbr></wbr>
1. 声明PL/SQL索引表类型 type type_name is table of element_type <wbr></wbr>[NOT NULL] index by key_type;<wbr></wbr>
2. 声明索引表变量 identifier type_name;<wbr></wbr>
例如:声明一个PL/SQL索引表用于保存fw用户的math表里的n1列的数据<wbr></wbr>
type n1_table_type is table of fw.math.n1%type index by pls_Integer;<wbr></wbr>
n1_table n1_table_type;<wbr></wbr>
接下来,我们可以使用BULK COLLECT进行赋值:<wbr></wbr>
select n1 BULK COLLECT into n1_table from fw.math;<wbr></wbr>
for i in n1_table.first..n1_table.last loop<wbr></wbr>
dbms_output.put_line('n1的值是:'||n1_table(i));<wbr></wbr>
end loop;<wbr></wbr>
n1_table.first函数返回这张PL/SQL表的第1个索引值,n1_table.last函数返回最后一个索引值。<wbr></wbr>
同样的,在使用游标的fetch into时,我们也可以用BULK COLLECT:<wbr></wbr>
declare
type n1_type is table of fw.math.n1%type index by pls_integer;
n1_var n1_type;
type n2_type is table of fw.math.n2%type index by pls_integer;
n2_var n2_type;
cursor math_cur is select n1,n2 from fw.math;
begin
open math_cur;
fetch math_cur bulk collect into n1_var,n2_var;
for i in n1_var.first..n1_var.last loop
dbms_output.put_line('n1的值是:'||n1_var(i)||' n2的值是:'||n2_var(i));
end loop;
close math_cur;
end;
上面的例子仅仅是输出几十行,但是如果这里需要输出的记录是上万行甚至更多的时候,那么BULK COLLECT<wbr></wbr>的就会发挥出强悍的优势。<wbr></wbr>
因此, 在面对大数据量的操作时,例如上万行,我们应该使用BULK COLLECT还是FORALL来提高我们的PL/SQL块执行的性能。
在演示BULK COLLECT之前,首先介绍相关知识:PL/SQL表。<wbr></wbr>
PL/SQL表是在PL/SQL很早的版本就已经存在了的一种特殊的表。之所以说它特殊,是因为它更象一个一维数组。它是一张N行1列的表,它的行号类似一维数组的下标,但和一维数组比起来,首先PL/SQL表的索引也即是行号可以任意指定一个为整数的值,甚至为负数也可以。而将它看成是一个一维数组的话,它是稀疏的,没有固定长度的,可以动态扩展的。它只能在PL/SQL里使用。<wbr></wbr>
声明一个PL/SQL表的语法:<wbr></wbr>
1. 声明PL/SQL索引表类型 type type_name is table of element_type <wbr></wbr>[NOT NULL] index by key_type;<wbr></wbr>
2. 声明索引表变量 identifier type_name;<wbr></wbr>
例如:声明一个PL/SQL索引表用于保存fw用户的math表里的n1列的数据<wbr></wbr>
type n1_table_type is table of fw.math.n1%type index by pls_Integer;<wbr></wbr>
n1_table n1_table_type;<wbr></wbr>
接下来,我们可以使用BULK COLLECT进行赋值:<wbr></wbr>
select n1 BULK COLLECT into n1_table from fw.math;<wbr></wbr>
for i in n1_table.first..n1_table.last loop<wbr></wbr>
dbms_output.put_line('n1的值是:'||n1_table(i));<wbr></wbr>
end loop;<wbr></wbr>
n1_table.first函数返回这张PL/SQL表的第1个索引值,n1_table.last函数返回最后一个索引值。<wbr></wbr>
同样的,在使用游标的fetch into时,我们也可以用BULK COLLECT:<wbr></wbr>
declare
type n1_type is table of fw.math.n1%type index by pls_integer;
n1_var n1_type;
type n2_type is table of fw.math.n2%type index by pls_integer;
n2_var n2_type;
cursor math_cur is select n1,n2 from fw.math;
begin
open math_cur;
fetch math_cur bulk collect into n1_var,n2_var;
for i in n1_var.first..n1_var.last loop
dbms_output.put_line('n1的值是:'||n1_var(i)||' n2的值是:'||n2_var(i));
end loop;
close math_cur;
end;
上面的例子仅仅是输出几十行,但是如果这里需要输出的记录是上万行甚至更多的时候,那么BULK COLLECT<wbr></wbr>的就会发挥出强悍的优势。<wbr></wbr>
因此, 在面对大数据量的操作时,例如上万行,我们应该使用BULK COLLECT还是FORALL来提高我们的PL/SQL块执行的性能。