如何用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
解决方案 »
- linux下安装Oracle 1521端口占用问题,求解!!!
- 如何给oracle字段加密
- oracle 触发器 如何实现记录曾经触发过的id,如何取这个记录的id的值
- 急急急!怎么把文件存成一个CLOB? 100分!
- 关于SQL排序的问题,请教,在线等
- 如何实现3个字段相同时保留另一个字段值最大的那条记录
- 数据导出不成功 ^^help^^
- 小弟特菜,请各位大哥赐教,来着有分(分不够我另开帖)
- 数据大小超出此类型的最大值?
- 访问 PRODUCT_USER_PROFILE 时出现错误!警告:未载入产品用户配置文件信息!您需要将 PUPBLD.SQL 作为 SYSTEM 运行!上面这个错误是什么意
- 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 ;