select (jbqk_dy/ygzs)*100 from T_DYJBXXTJB_TEMP是不是可以写成select (jbqk_dy/decode(ygzs,0,'',ygzs)*100 from T_DYJBXXTJB_TEMP我做了简单测试好象行的通,我刚学,请多多指教。

解决方案 »

  1.   

    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;
    /
      

  2.   

    楼上的方法可以,把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
      

  3.   

    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;
      

  4.   

    若T_DYJBXXTJB_TEMP 不是临时表则:
    create view zeroYgzs(jbbh,.......) as 
    select jbbh,..... from T_DYJBXXTJB_TEMP where ygzs is null or ygzs=0;
    否则,可以创建另一个临时表,存ygzs为null或0的信息;之后,用原来的存储过程进行操作。
    我想,在数据量大的情况下可能会好一点。
      

  5.   

    同意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;
      

  6.   

    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;
      

  7.   

    好了,问题解决了: 
    ttjd(ttjd) , bzszp(SongZip) ,  zhaoyongzhu(zhaoyongzhu) ,zhangshunshi(宇轩),
    其实是一个方法(略有不同),都是对的!
     gyang(我是谁?) 的方法和black_dragon(半仙) 的方法不能达到目的,
    我要在一个循环里更新多个字段的值,你们的方法在更新前面的字段出现
    异常后就跳过该循环了,其余的字段没有能更新。
    谢谢各位!