如何用sql编写的函数实现:日期小写转大写。如:2008-05-10       贰零零扒   零伍   壹拾   要求:
比如写出来的函数名为date_change();date_change(2008)返回结果:贰零零扒date_change(05)返回结果:零伍date_change(10)返回结果:壹拾
日期格式为:yyyy-mm-dd

解决方案 »

  1.   

    要只是日期字符变化,需求挺奇怪的。
    你可以使用以下的程序片段去处理
    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;以上代码也许能够你帮助。
      

  2.   

    SQL> select translate('2008-05-10','01258','零壹贰伍扒') 转换结果 from dual;转换结果
    ------------------
    贰零零扒-零伍-壹零
      

  3.   

    create or replace function date_change(strSrc in varchar2) return 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 贰 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;请问哪里出问题了?怎么修改?
      

  4.   

    when 1 then 壹
    汉字应该加单引号。
    其实这样的问题使用translate也可以解决,
    楼上有人写的就不错。
      

  5.   

    create or replace function date_change(strSrc in varchar2) return 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 '贰' 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;
      

  6.   

    如果用translate函数:
    SQL> select translate('2008-05-10','01258','零壹贰伍扒') 转换结果 from dual; 转换结果 
    ------------------ 
    贰零零扒-零伍-壹零 这并不是我想要的,我想要的结果为:贰零零扒-零伍-壹拾又如:'2008-05-21' 贰零零扒-零伍-贰拾壹
      

  7.   

    试一下这个函数:
    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 ;