是的,但是加了可以在后面继续执行,你不更新就一直是同样的数据做一百遍。
其实应该是你的程序逻辑有问题,你先执行了判断再去取光标的值。就是说你做判断的时候用的值不是你取到的值,所以你这边最好fetch放到循环体最开始。
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;
--涨工资
if salTotal+psal*1.1<50000 then
update emp set sal = sal*1.1 where empno=pempno;
--涨工资的人数
countEmp := countEmp+1;
--涨后的工资总额
salTotal := salTotal+psal*0.1;
else exit;
end if;
end loop;
--关闭光标
close cemp;
dbms_output.put_line('涨工资人数:'||countEmp|| '资总额:'||salTotal);
end;
不需要判断是否排序,因为他在定义光标的时候,已经使用了排序保存,这样操作的光标中的员工和员工工资就是按照从低到高进行的.
salTotal := salTotal + sal * 0.1;
sal 改成emp.sal
commit了就会修改表
请问下,这个问题是怎么解决的,我也遇到了这个问题,求指教
可以吧
第14行:update emp set sal=sal*1.1 when empno=pempno;
这里条件不应该是when,而是where
第20行:dbms_output.put_line(pename||psal);
这里pename未声明,根据你前面写的,应该是要写pname吧
代码执行的时候报错会提示第几行第几列,是什么问题,根据提示修改就可以。
update表后不是都已经提交了吗,为什么还能rollback??这不是违背了事务原子性吗
请问这样设计之后,结果应该还是会超过5W吧?
0.1不是1.1
你觉得加一个在涨工资前的判断,就可以不出现老师的问题了吗?答案很显然是把员工的 信息循环完一遍之后工资依然没有涨到5w,此时程序就退出了。正确的思路是,让程序再把所有员工信息循环一遍。你们到底自己试了没有?
因为不一定只是涨一次工资的,这个程序段可能多次使用,并且写完代码测试是个很好的习惯,但是我没有执行。。。