问答详情
源自:5-3 案例:员工涨工资问题

修改后的 答案!

/*

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;

/











提问者:smallf2 2015-05-01 21:02

个回答

  • LiuKeqing
    2017-10-03 17:42:54

    你觉得加一个在涨工资前的判断,就可以不出现老师的问题了吗?答案很显然是把员工的 信息循环完一遍之后工资依然没有涨到5w,此时程序就退出了。正确的思路是,让程序再把所有员工信息循环一遍。你们到底自己试了没有?

  • JesonWu
    2016-01-22 11:51:56

    tal number:=0;

  • smartsean
    2015-11-04 16:13:49

    在update前面加上 exit when (salTotal + psal*1.1) > 50000;