/*
SQL语言
select empno,sal from emp order by sal
--> 光标 --> 循环 --> 退出条件:1. 总额>5w 2.notfound涨完
变量
涨工资的人数: countEmp number := 0;
涨后的工资总额:salTotal number;
1. select sum(sal) into salTotal from emp;
2. 涨后=涨前+sal*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;
tal 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;
tal:=salTotal + psal *0.1;
exit when tal>50000; --在涨工资之前判断一下,涨后是否超过5W
--涨工资
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;
/
你觉得加一个在涨工资前的判断,就可以不出现老师的问题了吗?答案很显然是把员工的 信息循环完一遍之后工资依然没有涨到5w,此时程序就退出了。正确的思路是,让程序再把所有员工信息循环一遍。你们到底自己试了没有?
tal number:=0;
在update前面加上 exit when (salTotal + psal*1.1) > 50000;