各位好,因本人对oracle是初学者在其方面上欠缺还很多,所以望给予指教:
    下面是在oracle中增加自定义函数 fn_getdays 但是在if... then ... else if ... ...方面出现了问题,经努力还是没找到原因。
望在行的人帮忙看下,指点一下,感激不尽,下面是我修改过的,但是有问题给予改正。该函数是为求本月的实际天数,p1参数是传入的日期比如:“20040101”
------------------------------
    create or replace function fn_getdays(p1 varchar2) return integer
is
   v_year  varchar(4);
   v_month varchar2(2);
   v_return int;
--Result integer;
begin
   v_year := substring(p1,1,4);
   v_month := substring(p1,5,2);
   
   if v_month in ('01','03','05','07','08','10','12') then  --如果是31天的月份
     v_return := 31 
   else if v_month in ('04','06','09','11') then  --如果是30天的月份
     v_return := 30
   end if;
   else if v_month in ('02') then --如果是2月份
    begin
    if cast(v_year as int) / 4 = 0 then --如果整除4,则是闰年
      v_return := 29
    else
    v_return := 28       
        end if;     
        end if;
       end;
   end if;
   end if;
   return(v_return);
end fn_getdays;

解决方案 »

  1.   

    这个是IF的语法.
    IF condition1 THEN
     statement1;
    ELSIF condition2 THEN
     statement2;
    ELSIF condition3 THEN
     statement3;
    ELSE
     statement4;
    END IF;
     
      

  2.   

    只有两个if,却有5个end if
    这么明显的错误,楼主居然都发现不了create or replace function fn_getdays(p1 varchar2) return integer 
    is 
        v_year  varchar(4); 
        v_month varchar2(2); 
        v_return int; --Result integer; 
    begin 
        v_year := substring(p1,1,4); 
        v_month := substring(p1,5,2); 
      
        if v_month in ('01','03','05','07','08','10','12') then  --如果是31天的月份 
            v_return := 31 
        else if v_month in ('04','06','09','11') then  --如果是30天的月份 
             v_return := 30  
        else if v_month in ('02') then --如果是2月份 
        begin 
            if cast(v_year as int) / 4 = 0 then --如果整除4,则是闰年 
                  v_return := 29 
            else 
                v_return := 28      
            end if;    
        end; 
        end if; 
        return(v_return); 
    end fn_getdays;
      

  3.   


      不好意思啊,这个是个失误,我在改这个if问题时,找原因多加了还没给删除,所以...
      刚才试了下还是不行的,跟之前我遇到的一样,在几个 else if ... else if ... else... 遇到如下的报错,请问这个是因为什么呢??:
          FUNCTION NCHR.FN_GETDAYS 编译错误错误:PLS-00103: 出现符号 "ELSE"在需要下列之一时:
            * & = - + ; < / > at in is
              mod remainder not rem <an exponent (**)> <> or != or ~= >= <=
              <> and or like LIKE2_ LIKE4_ LIKEC_ between || multiset
              member SUBMULTISET_
           符号 ";" 被替换为 "ELSE" 后继续。
    行:12
    文本:else if v_month in ('04','06','09','11') then  --如果是30天的月份错误:PLS-00103: 出现符号 "ELSE"在需要下列之一时:
            * & = - + ; < / > at in is
              mod remainder not rem <an exponent (**)> <> or != or ~= >= <=
              <> and or like LIKE2_ LIKE4_ LIKEC_ between || multiset
              member SUBMULTISET_
           符号 ";" 被替换为 "ELSE" 后继续。
    行:14
    文本:else if v_month in ('02') then --如果是2月份错误:PLS-00103: 出现符号 "ELSE"在需要下列之一时:
            * & = - + ; < / > at in is
              mod remainder not rem <an exponent (**)> <> or != or ~= >= <=
              <> and or like LIKE2_ LIKE4_ LIKEC_ between || multiset
              member SUBMULTISET_
           符号 ";" 被替换为 "ELSE" 后继续。
    行:18
    文本:else错误:PLS-00103: 出现符号 "END"在需要下列之一时:
            * & = - + ; < / > at in is
              mod remainder not rem <an exponent (**)> <> or != or ~= >= <=
              <> and or like LIKE2_ LIKE4_ LIKEC_ between || multiset
              member SUBMULTISET_
           符号 ";" 被替换为 "END" 后继续。
    行:20
    文本:end if;错误:PLS-00103: 出现符号 "FN_GETDAYS"在需要下列之一时:
            if
    行:24
    文本:end fn_getdays;
      

  4.   

    create or replace function fn_getdays(p1 varchar2) return integer
    is
        v_year  int;
        v_month varchar2(2);
        v_return int; --Result integer;
    begin
        v_year := cast(substr(p1,1,4)as int);
        v_month := substr(p1,5,2);    if v_month in ('01','03','05','07','08','10','12') then  --如果是31天的月份
            v_return := 31;
        elsif v_month in ('04','06','09','11') then  --如果是30天的月份
             v_return := 30;
        elsif v_month in ('02') then --如果是2月份
        begin
          
            if mod(v_year,4) = 0 and mod(v_year,100)!=0 or mod(v_year,400) = 0 then 
    --①、普通年:能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年) 
    --②、世纪年:能被400整除的是闰年。(如2000年是闰年,1900年不是闰年) 
    --and 的优先级高于or
                  v_return := 29;
            else
                v_return := 28;
            end if;
        end;
        end if;
        return(v_return);
    end fn_getdays;