Oracle 里进制转换

 

 

 

Oracle中10進制轉換成36進制是沒有現成函數的,本人寫了一個function,是把10進制轉換成36進制的,36進制轉換成10進制.

首先了解一下进制的转换:

         36进制到十进制: 10Y就是 1* 36*36 + 0 * 36 + 34 =1330这样就把36进制转换成10进制了

         如10转36进制可以用以下方法:

                                 1330转换为10进制数的方法是“除36取余”方法,

                                 1330/36=商36余34,36进制最后一位为Y

                                 36/36=商1余0,36进制右边第二位为0

                                 1/36=商0余1,36进制右边第三位为1 

                                 商0就不继续除了

                                 最后的结果为10Y

下面我用Oracle 里的函數实现:

                                 36------》10

                                

代码
create or replace function change36To10
(
edh
varchar2
)
return varchar2
as
v_edh
varchar2 ( 32767 );
len number ( 10 ); -- 获取字符的长度
result number ( 38 ); -- 结果
i number ; -- 循环长度
temp varchar2 ( 30 ); -- 剩下的值
begin
v_edh:
= upper (edh);
result:
= 0 ;
select length(v_edh) into len from dual; -- 获取长度
for i in 0 .. len - 1 loop
result:
= result + changeEdthToNo(substr(v_edh, 0 , 1 )) * power ( 36 ,( len - i - 1 ));
v_edh:
= substr(v_edh, 2 );
end loop;
return result;
end ;

 

           10----》36  

代码
create or replace function createDecimalTothirty_six
(
createNo
number
)
return varchar2
as
result
varchar2 ( 10000 ); -- 最后的结果
v_createNo number ( 38 ); -- 临时变量
remainder number ( 38 ); -- 余数
shang number ( 38 ); --
v_shang number ( 38 ); --
i number ;
begin
v_createNo:
= createNo;
i:
= 1 ;
While i > 0 loop
if i = 1 then
select floor (v_createNo / 36 ) into shang from dual; -- 获取商
select mod(v_createNo, 36 ) into remainder from dual; -- 获取余数
result: = changeNoToEdh(remainder); -- 转换成36进制
v_shang: = shang;
else
select floor (v_shang / 36 ) into shang from dual; -- 获取商
select mod(v_shang, 36 ) into remainder from dual; -- 获取余数
result: = changeNoToEdh(remainder) || result;
v_shang:
= shang;
end if ;
if shang = 0 then
shang:
= 0 ;
exit ;
end if ;
i:
= i + 1 ;
end loop;
return result;
end ;

----------------

辅助函数:

  字母转换成数字

 

代码
create or replace function changeEdthToNo
(
f_no
char
)
return number
as
begin
IF f_no = ' A ' THEN
return 10 ;
ELSIF f_no
= ' B ' THEN
return 11 ;
ELSIF f_no
= ' C ' THEN
return 12 ;
ELSIF f_no
= ' D ' THEN
return 13 ;
ELSIF f_no
= ' E ' THEN
return 14 ;
ELSIF f_no
= ' F ' THEN
return 15 ;
ELSIF f_no
= ' G ' THEN
return 16 ;
ELSIF f_no
= ' H ' THEN
return 17 ;
ELSIF f_no
= ' I ' THEN
return 18 ;
ELSIF f_no
= ' J ' THEN
return 19 ;
ELSIF f_no
= ' K ' THEN
return 20 ;
ELSIF f_no
= ' L ' THEN
return 21 ;
ELSIF f_no
= ' M ' THEN
return 22 ;
ELSIF f_no
= ' N ' THEN
return 23 ;
ELSIF f_no
= ' O ' THEN
return 24 ;
ELSIF f_no
= ' P ' THEN
return 25 ;
ELSIF f_no
= ' Q ' THEN
return 26 ;
ELSIF f_no
= ' R ' THEN
return 27 ;
ELSIF f_no
= ' S ' THEN
return 28 ;
ELSIF f_no
= ' T ' THEN
return 29 ;
ELSIF f_no
= ' U ' THEN
return 30 ;
ELSIF f_no
= ' V ' THEN
return 31 ;
ELSIF f_no
= ' W ' THEN
return 32 ;
ELSIF f_no
= ' X ' THEN
return 33 ;
ELSIF f_no
= ' Y ' THEN
return 34 ;
ELSIF f_no
= ' Z ' THEN
return 35 ;
ElSIF f_no
= ' 0 ' or f_no = ' 1 ' or f_no = ' 2 ' or f_no = ' 3 ' or f_no = ' 4 ' or f_no = ' 5 ' or f_no = ' 6 ' or f_no = ' 7 ' or f_no = ' 8 ' or f_no = ' 9 ' then
return f_no;
else
return 36 ;
END IF ;
end ;

 

 

 

    数字转换成字母;

代码
create or replace function changeNoToEdh
(
f_no
number
)
return char
as
begin
IF f_no = 10 THEN
return ' A ' ;
ELSIF f_no
= 11 THEN
return ' B ' ;
ELSIF f_no
= 12 THEN
return ' C ' ;
ELSIF f_no
= 13 THEN
return ' D ' ;
ELSIF f_no
= 14 THEN
return ' E ' ;
ELSIF f_no
= 15 THEN
return ' F ' ;
ELSIF f_no
= 16 THEN
return ' G ' ;
ELSIF f_no
= 17 THEN
return ' H ' ;
ELSIF f_no
= 18 THEN
return ' I ' ;
ELSIF f_no
= 19 THEN
return ' J ' ;
ELSIF f_no
= 20 THEN
return ' K ' ;
ELSIF f_no
= 21 THEN
return ' L ' ;
ELSIF f_no
= 22 THEN
return ' M ' ;
ELSIF f_no
= 23 THEN
return ' N ' ;
ELSIF f_no
= 24 THEN
return ' O ' ;
ELSIF f_no
= 25 THEN
return ' P ' ;
ELSIF f_no
= 26 THEN
return ' Q ' ;
ELSIF f_no
= 27 THEN
return ' R ' ;
ELSIF f_no
= 28 THEN
return ' S ' ;
ELSIF f_no
= 29 THEN
return ' T ' ;
ELSIF f_no
= 30 THEN
return ' U ' ;
ELSIF f_no
= 31 THEN
return ' V ' ;
ELSIF f_no
= 32 THEN
return ' W ' ;
ELSIF f_no
= 33 THEN
return ' X ' ;
ELSIF f_no
= 34 THEN
return ' Y ' ;
ELSIF f_no
= 35 THEN
return ' Z ' ;
else
return f_no;
END IF ;
end ;

 

 

              

 

                              

转载于:https://www.cnblogs.com/jak-black/archive/2010/09/25/1834617.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值