v_num:=LPAD(v_num,(v_fmt-length(v_num)))  ;测试这条语句,v_num的值为null,请问哪里出错了?

解决方案 »

  1.   

    我觉得只有一个可能:V_NUM本身就是NULL
      

  2.   

    不是呀,v_num原先有值的,执行这条语句后,值就为null了
      

  3.   

    我测试了下,,如果v_num=2,length(v_num)就会是10,不知道怎么回事?
      

  4.   

    没有上下文,不好说.
     实在不行就在TEST窗口中测试一下. 不会在开大家玩笑吧?
      

  5.   

    不是呀!
    我的存储过程如下:
    create or replace procedure P_GET_INDEX  (v_vcAspID varchar,v_Ex char,v_isYear number,v_result out varchar)
    is
          v_num char(10);v_Fmt number;v_Year char(10);v_rowcount char(20);
     
    begin
          if v_isYear=1 then
                --select to_char(sysdate ,'YYYY') from dual;
            v_Year:=substr( to_char(sysdate ,'YYYY') ,3,2);
        else
            v_Year:='';
          end if;
          v_Fmt:=4 ;
          select COUNT(*) INTO v_rowcount from TB_SYS_INDEX where vcAspID= v_vcAspID and vcPrefix=v_ex and vcYear=v_Year;
          if v_rowcount<=0 then
                 insert into TB_SYS_INDEX values(v_vcAspID,v_ex,rtrim(v_Year),1);
          else
                 update TB_SYS_INDEX set fNum=fNum+1 where  vcAspID= v_vcAspID and vcPrefix=v_ex and vcYear=v_Year;
          end if;
          select to_char(fNum) into v_num from TB_SYS_INDEX where  vcAspID= v_vcAspID and vcPrefix=v_ex and vcYear=v_Year ;   
          if v_num<10000 then
                   DBMS_OUTPUT.PUT_LINE('  v_num=' ||v_num);
                  DBMS_OUTPUT.PUT_LINE('  length(v_num)=' ||length(v_num));
                  v_num:=LPAD(v_num,(v_fmt-length(v_num)))  ;
              v_num:=replace(v_num,' ','0');
              v_result:=rtrim(v_ex)||rtrim(v_Year)||rtrim(v_num)||',';
          else
                  v_result:=rtrim(v_ex)||rtrim(v_Year)||rtrim(v_num)||','  ;
          end if;  
    end P_GET_INDEX  ;
      

  6.   

    v_num char(10),当然v_num长度就为10啊.除非做trim
      

  7.   

    分析你的代码,当知道v_fmt只能等于4,
    如sxfwang() ( 二级(初级)) 所说,V_NUM 为CHAR(N),则除非为NULL,否则length(v_bum)总是n,
    从以上可以得出
      IF if v_num<10000 then
         v_num:=LPAD(v_num,4-10) ; --已经超出了V_NUM实际存储的字符.
         ...  END IF; 这样自然是NULL.因为对于第二个参数,如果是小于1,结果就是NULL.
      

  8.   

    干吗要有CHAR() 呢,用VARCHAR2() 不就不会有这样的事情发生了。
      

  9.   

    对 基本不用char了 用varchar2 自动的