1.SQL语句
2.变量: 1.初始值, 2.最终得到
3.题目如下:
实例1:统计每年入职的员工个数
SQL语句:
select to_char(hiredate,‘yyyy‘) from emp;
-->集合-->光标-->循环-->退出条件:notfound
变量: 1.初始值, 2.最终得到
count80 number :=0;
count81 number :=0;
count82 number :=0;
count87 number :=0;
set serveroutput on declare cursor cemp is select to_char(hiredate,‘yyyy‘) from emp; phiredate varchar2(4); --每年入职的员工人数: count80 number :=0; count81 number :=0; count82 number :=0; count87 number :=0; begin open cemp; loop --取一个员工的入职年份 fetch cemp into phiredate; --退出条件:not found exit when cemp%notfound; --判断年份 if phiredate =‘1980‘ then count80:=count80+1; elsif phiredate =‘1981‘ then count81:=count81+1; elsif phiredate =‘1982‘ then count82:=count82+1; else count87:=count87+1; end loop; close cemp; dbms_output.put_line(‘Total:‘||(count80+count81+count82+count87)) dbms_output.put_line(‘count81:‘||count81) dbms_output.put_line(‘count82:‘||count82) dbms_output.put_line(‘count87:‘||count87) end; /
实例2:为员工涨工资
从最低工资调起每人涨10%,但工资总额不能超过5万元,请计算涨工资的人数和涨工资后的工资总额,并输出涨工资人数及工资总额。
分析:
SQL语句:select empno,sal from emp order by sal;
--->光标--->退出:1.总额>5w 2.notfound
变量:1.初始值 2.最终得到
涨工资的人数:countEmp number :=0;
涨后的工资总额:salTotal number;
1.select sum(sal) from salTotal from emp;
2.涨后=涨前*0.1
set serveroutput on declare cursor cemp is select empno,sal from emp order by sal; pempno emp.empno%type; psal emp.sal%type; --涨工资的人数: countEmp number :=0; -- 涨后的工资总额: salTotal number; begin --得到初始的工资总额 select sum(sal) into salTotal from emp; open cemp; loop --1.总额>5w exit when salTotal>50000; --取一个员工 fetch cemp into pempno,psal; --2.notfound exit when cemp%notfound --涨工资(涨工资之前进行判断一下,如果多于50000就不涨) update emp set sal =sal*1.1 where empno =pempno; --人数+1 countEmp :=countEmp +1; --2.涨后=涨前+sal*0.1(当没有必要进行操作数据库时就不进行操作) salTotal :=salTotal+psal*0.1 end loop; close cemp; commit; dbms_output.put_line(‘人数:‘||countEmp||‘总金额:‘salTotal) end; /
实例3:实现按部门分段(6000以上,(6000,3000),3000以下)统计各工资段的职工人数,以及各部门的工资总额
SQL语句:
部门:select deptno from dept;
部门中员工的薪水:select sal from emp where deptno =???
变量:1.初始值 2.最终得到
每个段的人数:
count1 number; count2 number ;count3 number
部门的工资总额: salTatal number :=0
1,select sum(sal) into salTotal from emp where deptno=???
2.将部门当中所有员工的薪水都加起来
set serveroutput on declare --部门(定义光标就要定义变量) cursor cdept is select deptno from dept; pdeptno dept.deptno%type; --部门中员工的薪水 cursor cemp(dno number) is select sal from emp where deptno =dno; psal emp.sal%type; --每个段的人数: count1 number; count2 number ;count3 number --部门的工资总额: salTatal number :=0 begin open cdept; loop --取一个部门(取完就应该想到退出条件) fetch cdept into pdeptno; exit when cdept%notfound; --初始化 count1:=0;count2:=0;count3:=0; --部门的工资总额 select sum(sal) into salTotal from emp where deptno = pdeptno --取部门中员工的薪水 open cemp(pdeptno); loop fetch cemp into psal; exit when cemp%notfound; --判断 if psal<3000 then count1:=count1+1; elsif psal>=3000 and psal<6000 then count2:=count2+1 else count3:=count3+1 end if; end loop; close cemp; --保存结果 insert into msg values(pdeptno,count1,count2,count3,nvl(saltotal,0)) end loop; close cdept; commit; dbms_output.put_line(‘完成‘) end; /