我创建了一个函数:
create or replace function f_getCblrSl(
       qsrq Date,
       jzrq Date,
       cbrl Number)
return Number is
       v_sl Number(5);
       v_month Number(5); 
begin 
   v_sl := 0;
   v_month := to_char(jzrq,'mm') - to_char(qsrq,'mm');
   if v_month < 1 then
    if cblr >= to_char(qsrq,'dd') and cblr <= to_char(jzrq,'dd') then
         v_sl := 1;
      end if;
   else  
    if cblr >= to_char(qsrq,'dd') then 
         v_sl := 1;
      end if;
      if cblr <= to_char(jzrq,'dd') then
         v_sl := v_sl + 1;
      end if;
      v_sl := v_month -1 + v_sl;
  end if;
  return v_sl;
end; 
end f_getCblrSl;
该是判断在qsrq起始日期和jzrq截至日期之间出现了多少个日期为13的?
在SQL/PLUS中执行生成函数的sql,报创建的函数带有编译错误。不知道错在哪儿啊?创建完后我用执行
select f_getcblrsl(to_date('2006-9-1','yyyy-mm-dd'),to_date('2006-9-31','yyyy-mm-dd'),cblr) cnt,cbrybh cbry,qcbh from xt_qcxx
报错误:程序包或函数f_getcblrsl处于无效状态!
怎么回事!
谢谢!谢谢!

解决方案 »

  1.   

    create or replace function f_getCblrSl(
           qsrq Date,
           jzrq Date,
           cbrl Number)
    return Number is
           v_sl Number(5);
           v_month Number(5);
    begin
       v_sl := 0;
       v_month := to_char(jzrq,'mm') - to_char(qsrq,'mm');
       if v_month < 1 then
        if cbrl >= to_char(qsrq,'dd') and cbrl <= to_char(jzrq,'dd') then
             v_sl := 1;
          end if;
       else
        if cbrl >= to_char(qsrq,'dd') then
             v_sl := 1;
          end if;
          if cbrl <= to_char(jzrq,'dd') then
             v_sl := v_sl + 1;
          end if;
          v_sl := v_month -1 + v_sl;
      end if;
      return v_sl;
    end f_getCblrSl;
    /
      

  2.   

    唉,楼主连自己cbrl和cblr输错了都没发现,能建成功才怪呢。另外在SQL PLUS 里,输入show err 就能看到刚才创建的过程错在哪里。
      

  3.   

    create or replace function f_getCblrSl(
    qsrq Date,
    jzrq Date,
    cbrl Number)
    return Number is
    v_sl Number(5);
    v_month Number(5);
    begin
    v_sl := 0;
    v_month := to_char(jzrq,'mm') - to_char(qsrq,'mm');
    if v_month < 1 then
    if cbrl >= to_char(qsrq,'dd') and cbrl <= to_char(jzrq,'dd') then
    v_sl := 1;
    end if;
    else
    if cbrl >= to_char(qsrq,'dd') then
    v_sl := 1;
    end if;
    if cbrl <= to_char(jzrq,'dd') then
    v_sl := v_sl + 1;
    end if;
    v_sl := v_month -1 + v_sl;
    end if;
    return v_sl;
    end;1. 拼写错误cbrl ;
    2. 多了一个end 结束;