异常处理的问题,来者有分,解决者一定慷慨给分!
我有一个循环,其中要计算党员占员工总数的百分比,还有工人,妇女……
可能出现除数为0的情况,造成出错,
我现在想这样:如果除数为0,就跳过,继续计算下个值……
OPEN c_jg;
FETCH c_jg INTO v_jgbh,v_jgmc;
WHILE c_jg%FOUND LOOP
sql_str:='update T_DYJBXXTJB_TEMP '||
'set '||
'jbfx_dy=(select (jbqk_dy/ygzs)*100 from T_DYJBXXTJB_TEMP where jgbh='''||v_jgbh||''')'||
' where jgbh='''||v_jgbh||''''||
'jbfx_zg=.......;
EXECUTE IMMEDIATE sql_str;
FETCH c_jg INTO v_jgbh,v_jgmc;
END LOOP;
CLOSE c_jg;
select (jbqk_dy/ygzs)*100 from T_DYJBXXTJB_TEMP是不是可以写成
select (jbqk_dy/decode(ygzs,0,'',ygzs)*100 from T_DYJBXXTJB_TEMP
我做了简单测试好象行的通,我刚学,请多多指教。
begin
OPEN c_jg;
<<xx>>
begin
FETCH c_jg INTO v_jgbh,v_jgmc;
WHILE c_jg%FOUND LOOP
sql_str:='update T_DYJBXXTJB_TEMP '||
'set '||
'jbfx_dy=(select (jbqk_dy/ygzs)*100 from T_DYJBXXTJB_TEMP where jgbh='''||v_jgbh||''')'||
' where jgbh='''||v_jgbh||''''||
'jbfx_zg=.......;
EXECUTE IMMEDIATE sql_str;
FETCH c_jg INTO v_jgbh,v_jgmc;
END LOOP;
exception
when others then
goto xx;
end;
CLOSE c_jg;
end;
/
楼上的方法可以,把0替换成null就可以了
SQL> select * from a;
ID
---------
0
2
SQL> select 123/decode(id,0,'',id) from a;
123/DECODE(ID,0,'',ID)
----------------------
61.5
OPEN c_jg;
FETCH c_jg INTO v_jgbh,v_jgmc;
WHILE c_jg%FOUND LOOP
sql_str:='update T_DYJBXXTJB_TEMP '||
'set '||
'jbfx_dy=(select decode(ygzs,0,0,jbqk_dy/ygzs)*100 from T_DYJBXXTJB_TEMP where jgbh='''||v_jgbh||''')'||
' where jgbh='''||v_jgbh||''''||
'jbfx_zg=.......;
EXECUTE IMMEDIATE sql_str;
FETCH c_jg INTO v_jgbh,v_jgmc;
END LOOP;
CLOSE c_jg;
若T_DYJBXXTJB_TEMP 不是临时表则:
create view zeroYgzs(jbbh,......) as
select jbbh,.... from T_DYJBXXTJB_TEMP where ygzs is null or ygzs=0;
否则,可以创建另一个临时表,存ygzs为null或0的信息;
之后,用原来的存储过程进行操作。
我想,在数据量大的情况下可能会好一点。
同意zhaoyongzhu(zhaoyongzhu) 的写法:
用decode实现:
OPEN c_jg;
FETCH c_jg INTO v_jgbh,v_jgmc;
WHILE c_jg%FOUND LOOP
sql_str:='update T_DYJBXXTJB_TEMP '||
'set '||
'jbfx_dy=(select decode(ygzs,0,0,jbqk_dy/ygzs)*100 from T_DYJBXXTJB_TEMP where jgbh='''||v_jgbh||''')'||
' where jgbh='''||v_jgbh||''''||
'jbfx_zg=.......;
EXECUTE IMMEDIATE sql_str;
FETCH c_jg INTO v_jgbh,v_jgmc;
END LOOP;
CLOSE c_jg;
OPEN c_jg;
FETCH c_jg INTO v_jgbh,v_jgmc;
WHILE c_jg%FOUND LOOP
sql_str:='update T_DYJBXXTJB_TEMP '||
'set '||
'jbfx_dy=(select (jbqk_dy/ygzs)*100 from T_DYJBXXTJB_TEMP where jgbh='''||v_jgbh||''')'||
' where jgbh='''||v_jgbh||''''||
'jbfx_zg=.......;
begin
EXECUTE IMMEDIATE sql_str;
exception
when others then
null;
end;
FETCH c_jg INTO v_jgbh,v_jgmc;
END LOOP;
CLOSE c_jg;
好了,问题解决了:
ttjd(ttjd) , bzszp(SongZip) , zhaoyongzhu(zhaoyongzhu) ,zhangshunshi(宇轩),
其实是一个方法(略有不同),都是对的!
gyang(我是谁?) 的方法和black_dragon(半仙) 的方法不能达到目的,
我要在一个循环里更新多个字段的值,你们的方法在更新前面的字段出现
异常后就跳过该循环了,其余的字段没有能更新。
谢谢各位!