您的位置:首页 > 数据库 > Oracle

Oracle中各种进制相互转换

2014-08-09 23:04 387 查看
一、自带函数可实现十进制与十六进制相互转换,二进制与十进制转换。

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

三、自定义函数实现各进制间相互转换

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: