Oracle中各种进制相互转换

来源:互联网 发布:小动画制作软件 编辑:程序博客网 时间:2024/05/12 21:40

一、自带函数可实现十进制与十六进制相互转换,二进制与十进制转换。

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

0 0