在Oracle 中往往需要的到某些字段的值:
        select nvl(sl, 0) into kc
          from hd_b_ljkcmx
         where ckcode = GET_CODE_TDJ_KC_Info.ckcode  ;
如上 是得到 sl 的字段值。有两个问题请教:1-- 如何一次性得到多个字段的值。   select nvl(sl, 0) into kc ,nvl(sl2,0) into kc2,nvl(sl3,0) into kc3
          from hd_b_ljkcmx
         where ckcode = GET_CODE_TDJ_KC_Info.ckcode  ;以上 写法 总是提示 找不到 from ,不知道是不是 plsql 的版本 所引起的。
还是 这样的写法不对,如果不对的话,正确的写法 该如何写?2-- 在以上的取值过程中, 如果存在 这条记录 取值才成功,但是如果不存在 这条记录的情况下,        select nvl(sl, 0) into kc
          from hd_b_ljkcmx
         where ckcode = GET_CODE_TDJ_KC_Info.ckcode  ;
写法 执行的过程中总是报错。为了避免 出错,查找之前总是判断 是否有记录存在:
      select nvl(sum(count(*)),0) into KC
        from  hd_b_ljkcmx
      where ckcode = GET_CODE_TDJ_KC_Info.ckcode  
      group by ckcode,ljbh;
      
      if KC>0 then
        select nvl(sl, 0) into kc
          from hd_b_ljkcmx
         where ckcode = GET_CODE_TDJ_KC_Info.ckcode  ;
      else
          kc:=0;
      end if;但是 这样写严重的影响效率,如何 避免以上 的错误发生,又不影响 效率。期待 各位高手回复。

解决方案 »

  1.   

    select nvl(sl, 0),nvl(sl2,0),nvl(sl3,0) into kc ,kc2,kc3
              from hd_b_ljkcmx
             where ckcode = GET_CODE_TDJ_KC_Info.ckcode  ;
      

  2.   

    都有值 的情况下:
    select nvl(sl, 0),nvl(sl2,0),nvl(sl3,0) into kc ,kc2,kc3
              from hd_b_ljkcmx
             where ckcode = GET_CODE_TDJ_KC_Info.ckcode  ;
    是最简洁的写法。
    谢谢:yuyu 1980但是: 这样写的话,如果有一个值 找不到的话,也会报错。该如何处理?
      

  3.   

    没纪录的话
    做异常处理EXCEPTION  
      WHEN NO_DATA_FOUND THEN  
        return 0.00; 就不会报错了!
      

  4.   

    no_data_found是Oracle的内部异常,绕不开的,要不先检查,要不做异常处理。
      

  5.   

    对了,个人认为 helloworld_001 的做法不可取,return 的话岂不是停止了程序的执行?EXCEPTION
    WHEN NO_DATA_FOUND THEN
     null;或者根据情况做别的处理是不是更妥当?
      

  6.   

    在执行select ... into ... 的时候必须保证有一条数据,多了或者没有都会抛异常,oracle中抛异常也是要占用资源的,如果你的程序发生在大量的并发中,建议少抛异常,尽量在 select ... into ... 前做数据检查。如果不想这样,可以使用游标,只fetch第一条,如没数据也可以做你想要的操作。