welsper.jer
宇智波带自行车
慕容1086703
是的,但是加了可以在后面继续执行,你不更新就一直是同样的数据做一百遍。
慕九州7682859
其实应该是你的程序逻辑有问题,你先执行了判断再去取光标的值。就是说你做判断的时候用的值不是你取到的值,所以你这边最好fetch放到循环体最开始。
慕粉2310089285
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;
迈克猴
不需要判断是否排序,因为他在定义光标的时候,已经使用了排序保存,这样操作的光标中的员工和员工工资就是按照从低到高进行的.
judyW
salTotal := salTotal + sal * 0.1;
sal 改成emp.sal
qq_差不多就好_04223433
commit了就会修改表
zhaoping55
请问下,这个问题是怎么解决的,我也遇到了这个问题,求指教
一蓑烟雨2
可以吧
慕前端0336099
第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
smallf2
你觉得加一个在涨工资前的判断,就可以不出现老师的问题了吗?答案很显然是把员工的 信息循环完一遍之后工资依然没有涨到5w,此时程序就退出了。正确的思路是,让程序再把所有员工信息循环一遍。你们到底自己试了没有?
匣子洁
因为不一定只是涨一次工资的,这个程序段可能多次使用,并且写完代码测试是个很好的习惯,但是我没有执行。。。