提高性能--使用输出集合

 无论是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块执行的性能。

你可能感兴趣的:(sql)