oracle用户自定义函数问题,望求助!!

Josir 2009-03-12 02:39:13
各位好,因本人对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;
...全文
194 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
cmknba 2011-12-16
  • 打赏
  • 举报
回复
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;
白发程序猿 2009-03-12
  • 打赏
  • 举报
回复
对,是没加;
Josir 2009-03-12
  • 打赏
  • 举报
回复
是没有加 ;结尾的原因吧?
Josir 2009-03-12
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 ling242a 的回复:]
只有两个if,却有5个end if
这么明显的错误,楼主居然都发现不了

SQL code
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天的…
[/Quote]

不好意思啊,这个是个失误,我在改这个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;
白发程序猿 2009-03-12
  • 打赏
  • 举报
回复
只有两个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;
rexyudl 2009-03-12
  • 打赏
  • 举报
回复
这个是IF的语法.
IF condition1 THEN
 statement1;
ELSIF condition2 THEN
 statement2;
ELSIF condition3 THEN
 statement3;
ELSE
 statement4;
END IF;



17,377

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 基础和管理
社区管理员
  • 基础和管理社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧