异常处理的问题,来者有分,解决者一定慷慨给分!

我有一个循环,其中要计算党员占员工总数的百分比,还有工人,妇女……
可能出现除数为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;
[600 byte] By [jiezhi-风满袖] at [2007-12-16]
# 1
select (jbqk_dy/ygzs)*100 from T_DYJBXXTJB_TEMP是不是可以写成

select (jbqk_dy/decode(ygzs,0,'',ygzs)*100 from T_DYJBXXTJB_TEMP

我做了简单测试好象行的通,我刚学,请多多指教。
ttjd-ttjd at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...
# 2
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;
/
gyang-我是谁? at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...
# 3
楼上的方法可以,把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
bzszp-SongZip at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...
# 4
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;
zhaoyongzhu-zhaoyongzhu at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...
# 5
若T_DYJBXXTJB_TEMP 不是临时表则:
create view zeroYgzs(jbbh,......) as
select jbbh,.... from T_DYJBXXTJB_TEMP where ygzs is null or ygzs=0;
否则,可以创建另一个临时表,存ygzs为null或0的信息;

之后,用原来的存储过程进行操作。
我想,在数据量大的情况下可能会好一点。
kmlinda at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...
# 6
同意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;
zhangshunshi-宇轩 at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...
# 7
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;
black_dragon-半仙 at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...
# 8
你们的方法我都试试,成功了马上给各位加分!
jiezhi-风满袖 at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...
# 9
好了,问题解决了:
ttjd(ttjd) , bzszp(SongZip) , zhaoyongzhu(zhaoyongzhu) ,zhangshunshi(宇轩),
其实是一个方法(略有不同),都是对的!
gyang(我是谁?) 的方法和black_dragon(半仙) 的方法不能达到目的,
我要在一个循环里更新多个字段的值,你们的方法在更新前面的字段出现
异常后就跳过该循环了,其余的字段没有能更新。
谢谢各位!
jiezhi-风满袖 at 2007-10-23 > top of Msdn China Tech,Oracle,基础和管理...