日期:2014-05-17  浏览次数:20985 次

使用bulk collect有点疑问
declare 
type tableType is table of emp%rowtype index by binary_integer;
v_emp tableType;
v_maxSal emp.sal%type;
i number(10);
begin 
  for v_dept in (select * from dept )  loop
  select max(sal) into v_maxSal from emp where deptno=v_dept.deptno;
  select * bulk collect into v_emp from emp where sal=v_maxSal;-----------------有疑问的地方
  dbms_output.put_line('部门编号:'||v_dept.deptno);
  dbms_output.put_line('========================');
  if v_emp.count>0 then
    for i in v_emp.first..v_emp.last loop
    dbms_output.put_line(v_emp(i).ename||' '||v_emp(i).sal);
    end loop;
    else
      dbms_output.put_line('该部门没有员工');
      end if;
      dbms_output.put_line('========================');
      end loop;
end;
我注释的那一行中,去掉 bulk collect就出错了,虽然v_emp 是一个索引表(集合)类型,但是此条语句只是向v_emp 中插入了一条信息啊(loop每循环一次),为什么还一定要加上bulk collect呢?
bulk?collect

------解决方案--------------------
在执行之前就要解析,这时候只能解析到你的类型,等它知道只有一行的时候,已经执行了。

所以,只要你写的是table of rowtype,肯定要加bulk collect,除非你把它换成rowtype,才能用into。
------解决方案--------------------
那是因为, v_emp你定义的是集合类型。不信,你可以将select *。。。换成select col1,col2,col3...,并将v_emp换成多个普通变量试试。