如何用sql编写的函数实现:日期小写转大写。如:2008-05-10 贰零零扒 零伍 壹拾 要求:
比如写出来的函数名为date_change();date_change(2008)返回结果:贰零零扒date_change(05)返回结果:零伍date_change(10)返回结果:壹拾
日期格式为:yyyy-mm-dd
比如写出来的函数名为date_change();date_change(2008)返回结果:贰零零扒date_change(05)返回结果:零伍date_change(10)返回结果:壹拾
日期格式为:yyyy-mm-dd
解决方案 »
- 用VC6.0开发OCCI驱动的问题,ORACLE高手进,在线等。。。。
- sql转换成oracle 触发器,急求
- 想问一个问题,关于存储过程和动态SQL的
- oracle 自带的SQL PLUS登录不上?
- 请问ORACLE有没有ODBC Driver For AIX得呢?
- 游标、参数、传递
- 用Oracle Enterprise Manager Console查看会话信息时,SID左边连接图标有时显示为时钟图标,表示什么呢
- 数据复制可以复制大字段吗
- 请问,我的存储过程的返回值为某个表的%ROWTYPE,我想在PRO*C中调用这个存储过程,如何定义它的返回值才能调用,谢谢
- TO_DATE('2002-AUG-22','YYYY-MON-DD')为什么说月份不对?
- oracle读取文件内容
- 在oracle 求一个按线路号模糊查询的方法
你可以使用以下的程序片段去处理
function date_change(strSrc in varchar2)
is
v_strDesc varchar2(100);
begin
for i in 1..length(strSrc) loop
v_strDesc :=v_strDesc || case substr(strSrc,i,1)
when 1 then 壹
when 2 then 贰
。
else ''
end case;end loop;
return v_strDesc;
end;以上代码也许能够你帮助。
------------------
贰零零扒-零伍-壹零
v_strDesc varchar2(100);
begin
for i in 1 .. length(strSrc) loop
v_strDesc := v_strDesc || case substr(strSrc, i, 1) when 1 then 壹 when 2 then 贰 when 3 then 叁 when 4 then 肆 when 5 then 伍 when 6 then 陆 when 7 then 柒 when 8 then 扒 when 9 then 玖 else '零' end case;
end loop;
return v_strDesc;
end;====================================================
报如下错误:
Compilation errors for FUNCTION LG.DATE_CHANGEError: PLS-00103: 出现符号 "CASE"在需要下列之一时:
* & = - + ; < / > at in is
mod not rem <an exponent (**)> <> or != or ~= >= <= <> and or
like between ||
符号 "CASE" 被忽略。
Line: 5
Text: v_strDesc := v_strDesc || case substr(strSrc, i, 1) when 1 then 壹 when 2 then 贰 when 3 then 叁 when 4 then 肆 when 5 then 伍 when 6 then 陆 when 7 then 柒 when 8 then 扒 when 9 then 玖 else '零' end case;请问哪里出问题了?怎么修改?
汉字应该加单引号。
其实这样的问题使用translate也可以解决,
楼上有人写的就不错。
v_strDesc varchar2(100);
begin
for i in 1 .. length(strSrc) loop
v_strDesc := v_strDesc || case substr(strSrc, i, 1) when 1 then '壹' when 2 then '贰' when 3 then '叁' when 4 then '肆' when 5 then '伍' when 6 then '陆' when 7 then '柒' when 8 then '扒' when 9 then '玖' else '零' end case;
end loop;
return v_strDesc;
end;
==================
汉字加单引号,还是编译不通过:
Compilation errors for FUNCTION LG.DATE_CHANGEError: PLS-00103: 出现符号 "CASE"在需要下列之一时:
* & = - + ; < / > at in is
mod not rem <an exponent (**)> <> or != or ~= >= <= <> and or
like between ||
符号 "CASE" 被忽略。
Line: 5
Text: v_strDesc := v_strDesc || case substr(strSrc, i, 1) when 1 then '壹' when 2 then '贰' when 3 then '叁' when 4 then '肆' when 5 then '伍' when 6 then '陆' when 7 then '柒' when 8 then '扒' when 9 then '玖' else '零' end case;
SQL> select translate('2008-05-10','01258','零壹贰伍扒') 转换结果 from dual; 转换结果
------------------
贰零零扒-零伍-壹零 这并不是我想要的,我想要的结果为:贰零零扒-零伍-壹拾又如:'2008-05-21' 贰零零扒-零伍-贰拾壹
create or replace function f_convert_date(ld_date date)
return varchar2
as
li_num integer;
ls_ret varchar2(100);
ls_in_date varchar2(10);
ls_year varchar2(30);
ls_month varchar2(30);
ls_day varchar2(30);
begin
ls_in_date:=to_char(ld_date,'yyyy-mm-dd');
select count(1) into li_num from dual where regexp_like(ls_in_date,'^\d{4}-\d{1,2}-\d{1,2}$','i');
if li_num<>1 then
ls_ret:='invalid date format';
else
ls_year:=substr(ls_in_date,1,4);
ls_month:=substr(ls_in_date,6,2);
ls_day:=substr(ls_in_date,9,2);
ls_year:=translate(ls_year,'0123456789','零壹贰叁肆伍陆柒捌玖');
if substr(ls_month,1,1)='0' then
ls_month:='零'||translate(substr(ls_month,2,1),'0123456789','零壹贰叁肆伍陆柒捌玖');
else
ls_month:=translate(substr(ls_month,1,1),'0123456789','零壹贰叁肆伍陆柒捌玖')||'拾'||translate(substr(ls_month,2,1),'0123456789','零壹贰叁肆伍陆柒捌玖');
end if ;
if substr(ls_day,1,1)='0' then
ls_day:='零'||translate(substr(ls_day,2,1),'0123456789','零壹贰叁肆伍陆柒捌玖');
else
ls_day:=translate(substr(ls_day,1,1),'0123456789','零壹贰叁肆伍陆柒捌玖')||'拾'||translate(substr(ls_day,2,1),'0123456789','零壹贰叁肆伍陆柒捌玖');
end if ;
ls_ret:=ls_year||'年'||ls_month||'月'||ls_day||'日';
end if ;
return ls_ret;
end ;