各位好,因本人对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;
下面是在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;
解决方案 »
- 跪求高人--Oracle复制远程数据库表到本地的问题
- 求解:我使用的Oracle 9i + c#开发一个程序,oracle.exe进程所占用的内存不断地缓慢增长!~
- 有一个复杂的sql查询语句,想用存储过程来写,返回查询结果集合,格式改怎么写
- 我的SYS用户怎么在SQL*Plus里登陆不上去?
- 小妹急求在oracle8I上建一个job,把A表中的数据定时在晚上1点导入另外一台计算机的oracle8I(9I)的B表上
- 如何删除A用户下的所有表啊?
- 求助ora-01033 的问题
- 安装Oracle8i中出现的监听程序启动的问题。
- 应用跑一段时间后插入数据变慢
- 请教一个数据库字段超长的问题
- 数据库的问题,在线等;
- 用not exists 取最大值为什么没用
IF condition1 THEN
statement1;
ELSIF condition2 THEN
statement2;
ELSIF condition3 THEN
statement3;
ELSE
statement4;
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;
不好意思啊,这个是个失误,我在改这个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;
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;