打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Oracle中各种进制相互转换
一、自带函数可实现十进制与十六进制相互转换,二进制与十进制转换。
1.16进制转换为10进制
可以通过to_number函数实现
SQL> select to_number('19f','xxx') from dual;
TO_NUMBER('19F','XXX')
----------------------
415
SQL> select to_number(1024,'xxxx') from dual;
TO_NUMBER(1024,'XXXX')
-------------------
4132
2.10进制转换为16进制
可以通过to_char函数转换
SQL> select to_char(123,'xxx') from dual;
TO_C
----
7b
SQL> select to_char(4567,'xxxx') from dual;
TO_CH
-----
11d7
3.2进制转换为10进制
从Oracle9i开始,提供函数bin_to_num进行2进制到10进制的转换
SQL> select bin_to_num(1,1,0,1) a,bin_to_num(1,0) b from dual;
A B
----- ----------
13 2
SQL> select bin_to_num(1,1,1,0,1) from dual;
BIN_TO_NUM(1,1,1,0,1)
---------------------
29
来源:http://www.eygle.com/archives/2004/06/oracle_howto_convert.html
二、用一条SQL实现其他进制到十进制转换示例
-----二进制转换十进制-----------------
SELECT SUM(data1)
FROM (SELECT SUBSTR('1101', rownum, 1) * power(2, LENGTH('1101') - rownum) data1
FROM dual
CONNECT BY rownum <= LENGTH('1101'));
-----八进制转换十进制-----------------
SELECT SUM(data1)
FROM (SELECT SUBSTR('1101', rownum, 1) * power(8, LENGTH('1101') - rownum) data1
FROM dual
CONNECT BY rownum <= LENGTH('1101'));
-----十六进制转换十进制-----------------
SELECT SUM(data1)
FROM (SELECT (CASE upper(SUBSTR('2D', rownum, 1))
WHEN 'A' THEN '10'
WHEN 'B' THEN '11'
WHEN 'C' THEN '12'
WHEN 'D' THEN '13'
WHEN 'E' THEN '14'
WHEN 'F' THEN '15'
ELSE SUBSTR('2D', rownum, 1)
END) * power(16, LENGTH('2D') - rownum) data1
FROM dual
CONNECT BY rownum <= LENGTH('2D'));
来源:http://database.51cto.com/art/201103/250577.htm
三、自定义函数实现各进制间相互转换
[sql]
create or replace package pkg_digit_conv as
--将字符串转换为其在数据库中的二进制存储格式
function fun_str2bin(par_str in varchar2) return varchar2;
--将二进制转换为10进制
function fun_bin2dec(par_bin in varchar2) return varchar2;
--将二进制转换为8进制
function fun_bin2oct(par_bin in varchar2) return varchar2;
--将二进制转换为16进制
function fun_bin2hex(par_bin in varchar2) return varchar2;
--将10进制转换为二进制
function fun_dec2bin(par_dec in varchar2) return varchar2;
--将8进制转换为二进制
function fun_oct2bin(par_oct in varchar2) return varchar2;
--将16进制转换为二进制
function fun_hex2bin(par_hex in varchar2) return varchar2;
end;
create or replace package body pkg_digit_conv as
--将字符串转换为其在数据库中的二进制存储格式
function fun_str2bin(par_str in varchar2) return varchar2
as
v_strlen pls_integer;
v_detemp number;
v_bintemp varchar2(20);
v_retval varchar2(1000);
begin
select length(par_str) into v_strlen from dual;
for i in 1 .. v_strlen loop
select to_number(ascii(substr(par_str,i,1))) into v_detemp from dual;
select fun_dec2bin(v_detemp) into v_bintemp from dual;
v_retval :=nvl(v_retval,'')|| v_bintemp;
end loop;
return v_retval;
end;
--将二进制转换为10进制
function fun_bin2dec(par_bin in varchar2) return varchar2
as
v_retval varchar2(100);
begin
select sum(d) into v_retval from (
select substr(par_bin,rownum,1)*power(2,length(par_bin)-rownum) d from dual connect by rownum <= length(par_bin)
);
return v_retval;
end;
--将二进制转换为8进制
function fun_bin2oct(par_bin in varchar2) return varchar2
as
v_octlen pls_integer;
v_octtemp varchar2(3);
v_retemp varchar2(1);
v_retval varchar2(1000);
begin
select ceil(length(par_bin)/3) into v_octlen from dual;
for i in 1..v_octlen loop
if(3*i<=length(par_bin)) then
select substr(par_bin,0-3*i,3) into v_octtemp from dual;
else
select substr(par_bin,0-length(par_bin),length(par_bin)-3*i+3) into v_octtemp from dual;
end if;
select fun_bin2dec(v_octtemp) into v_retemp from dual;
v_retval := v_retemp||nvl(v_retval,'');
end loop;
return v_retval;
end;
--将二进制转换为16进制
function fun_bin2hex(par_bin in varchar2) return varchar2
as
v_hexlen pls_integer;
v_hextemp varchar2(4);
v_retemp varchar2(1);
v_retval varchar2(1000);
begin
select ceil(length(par_bin)/4) into v_hexlen from dual;
for i in 1..v_hexlen loop
if(4*i<=length(par_bin)) then
select substr(par_bin,0-4*i,4) into v_hextemp from dual;
else
select substr(par_bin,0-length(par_bin),length(par_bin)-4*i+4) into v_hextemp from dual;
select substr('000'||v_hextemp,-4,4) into v_hextemp from dual;
end if;
case v_hextemp
WHEN '0000' THEN v_retemp :='0' ;
WHEN '0001' THEN v_retemp :='1' ;
WHEN '0010' THEN v_retemp :='2' ;
WHEN '0011' THEN v_retemp :='3' ;
WHEN '0100' THEN v_retemp :='4' ;
WHEN '0101' THEN v_retemp :='5' ;
WHEN '0110' THEN v_retemp :='6' ;
WHEN '0111' THEN v_retemp :='7' ;
WHEN '1000' THEN v_retemp :='8' ;
WHEN '1001' THEN v_retemp :='9' ;
WHEN '1010' THEN v_retemp :='A' ;
WHEN '1011' THEN v_retemp :='B' ;
WHEN '1100' THEN v_retemp :='C' ;
WHEN '1101' THEN v_retemp :='D' ;
WHEN '1110' THEN v_retemp :='E' ;
else v_retemp :='F' ;
end case;
v_retval := v_retemp||nvl(v_retval,'');
end loop;
return v_retval;
end;
--将10进制转换为二进制
function fun_dec2bin(par_dec in varchar2) return varchar2
as
yushu number;
retemp varchar2(1);
retval varchar2(1000);
begin
select to_number(par_dec) into yushu from dual;
while yushu >0 loop
select mod(yushu,2) into retemp from dual;
retval := retemp || nvl(retval,'');
select trunc(yushu/2) into yushu from dual;
end loop;
return retval;
end;
--将8进制转换为二进制
function fun_oct2bin(par_oct in varchar2) return varchar2
as
v_octlen pls_integer;
v_octchar varchar2(1);
v_dectemp number := 0;
v_retval varchar2(1000);
begin
select length(par_oct) into v_octlen from dual;
for i in 1..v_octlen loop
v_dectemp := v_dectemp + to_number(substr(par_oct,i,1))*power(8,v_octlen-i);
end loop;
select fun_dec2bin(to_char(v_dectemp)) into v_retval from dual;
return v_retval;
end;
--将16进制转换为二进制
function fun_hex2bin(par_hex in varchar2) return varchar2
as
v_hexlen pls_integer;
v_dectemp number;
begin
select length(par_hex) into v_hexlen from dual;
select to_number(par_hex,lpad('x',v_hexlen,'x')) into v_dectemp from dual;
return fun_dec2bin(v_dectemp);
end;
end;
来源:http://blog.csdn.net/yidian815/article/details/11804781
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
ORACLE中的BITAND函数
精妙SQL语句(ora)
zhouweifeng | 分割串问题
浅议Oracle中的进制转换
orcal 时间分组查询
PLC的BIN数资料艾特贸易网手机版
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服