使用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呢?
------解决方案--------------------在执行之前就要解析,这时候只能解析到你的类型,等它知道只有一行的时候,已经执行了。
所以,只要你写的是table of rowtype,肯定要加bulk collect,除非你把它换成rowtype,才能用into。
------解决方案--------------------那是因为, v_emp你定义的是集合类型。不信,你可以将select *。。。换成select col1,col2,col3...,并将v_emp换成多个普通变量试试。