Oracle中各种进制相互转换
2014-08-09 23:04
387 查看
一、自带函数可实现十进制与十六进制相互转换,二进制与十进制转换。
1.16进制转换为10进制
可以通过to_number函数实现
2.10进制转换为16进制
可以通过to_char函数转换
3.2进制转换为10进制
从Oracle9i开始,提供函数bin_to_num进行2进制到10进制的转换
来源: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
三、自定义函数实现各进制间相互转换
来源:http://blog.csdn.net/yidian815/article/details/11804781
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 |
可以通过to_char函数转换
SQL> select to_char(123,'xxx') from dual; TO_C ---- 7b SQL> select to_char(4567,'xxxx') from dual; TO_CH ----- 11d7 |
从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 |
二、用一条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
相关文章推荐
- VB 各种进制相互转换大全(二)
- 自己实现各种进制相互转换
- VB 各种进制相互转换大全
- JAVA各种进制间的相互转换
- 一个php写的各种进制相互转换的小工具
- pd连接数据库生成pd图/各种数据库相互转换(以oracle->mysql为例)/导出成各种数据库脚本
- pd连接数据库生成pd图/各种数据库相互转换(以oracle->mysql为例)/导出成各种数据库脚本
- VB 各种进制相互转换大全
- VB 各种进制相互转换
- C# 各种进制之间相互转换
- VB 各种进制相互转换大全
- PHP实现的各种进制相互转换功能小工具示例
- C# 各种进制之间相互转换 [ZT]
- VB 各种进制相互转换大全
- VB 各种进制相互转换大全(一)
- C# 各种进制之间相互转换
- java中各种进制间的转换
- C# 2进制、8进制、10进制、16进制...各种进制间的轻松转换
- 2进制、8进制、10进制、16进制...各种进制间的轻松转换(c#)
- 各种进制的转换