/*
实例3:按部门统计工资人数
可能的sql
select deptno from dept; 查出所有的部门号 光标1
select sal from emp where deptno= 光标1中的值
*/
set serveroutput on
declare
--定义部门光标
cursor dcorsor is select deptno from dept;
pdno dept.deptno% TYPE;--保存部门号
--定义某部门下的员工光标
cursor cemp(dno number) is select sal from emp where deptno = dno;
psal emp.sal% TYPE;--保存员工薪水
--计数器
count1 number;--6000
count2 number;--3000~6000
count3 number;--<3000
psalTotal number;--工资总额
begin
--获取部门号
open dcorsor;
loop
--取部门
fetch dcorsor into pdno;
exit when dcorsor%notfound;
--初始化
count1 := 0;count2 := 0;count3 := 0;psalTotal :=0;
--select sum(sal) into psalTotal from emp where empno=pdno;
--取该部门中的员工
open cemp(pdno);
loop
--取一个员工
fetch cemp into psal;
exit when cemp%notfound;
--判断
if psal <= 3000 then count3 := count3 + 1;
ELSIF psal >3000 and psal <= 6000 then count2 := count2 + 1;
else count1 := count1+ 1;
end if;
--工资总额
psalTotal := psalTotal + psal;
end loop;
close cemp;--完成一个部门
--保存结果
insert into msg1 values(pdno, count3,count2,count1, psaltotal);
commit;
end loop;
close dcorsor;
dbms_output.put_line('完成');
end;
/