浅议Oracle中的进制转换
2005-06-27 16:38:10 Eygle
 
  进制转换是开发中经常需要用到的,本文简单介绍几种常用的进制转化方法. 

一、16进制转换为10进制 

  可以通过to_number函数实现 

SQL> select to_number(’19f’,’xxx’) from dual; 
TO_NUMBER(’19F’,’XXX’) 
---------------------- 
415 
SQL> select to_number(’f’,’xx’) from dual; 
TO_NUMBER(’F’,’XX’) 
------------------- 
15

二、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

三、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

四、通过自定义函数实现进制转换 

  以下函数来自AskTom网站,是Tom给出的例子,供参考: 

create or replace function to_base( p_dec in number, p_base in number ) 
return varchar2 
is 
l_str varchar2(255) default NULL; 
l_num number default p_dec; 
l_hex varchar2(16) default ’0123456789ABCDEF’; 
begin 
if ( trunc(p_dec) <> p_dec OR p_dec < 0 ) then 
raise PROGRAM_ERROR; 
end if; 
loop 
l_str := substr( l_hex, mod(l_num,p_base)+1, 1 ) || l_str; 
l_num := trunc( l_num/p_base ); 
exit when ( l_num = 0 ); 
end loop; 
return l_str; 
end to_base; 

create or replace function to_dec 

( p_str in varchar2, 
p_from_base in number default 16 ) return number 
is 
l_num number default 0; 
l_hex varchar2(16) default ’0123456789ABCDEF’; 
begin 
for i in 1 .. length(p_str) loop 
l_num := l_num * p_from_base + instr(
l_hex,upper(substr(p_str,i,1)))-1; 
end loop; 
return l_num; 
end to_dec; 

show errors 
create or replace function to_hex( 
p_dec in number ) return varchar2 
is 
begin 
return to_base( p_dec, 16 ); 
end to_hex; 

create or replace function to_bin( 
p_dec in number ) return varchar2 
is 
begin 
return to_base( p_dec, 2 ); 
end to_bin; 

create or replace function to_oct( 
p_dec in number ) return varchar2 
is 
begin 
return to_base( p_dec, 8 ); 
end to_oct; 
/