日期:2014-05-16  浏览次数:20495 次

Oracle的10进制和16进制转换函数

在数据库中,常常需要将10进制转16进制,又会需要将16进制转10进制。有两个使用PL/SQL开发的函数,可以方便使用。


create or replace function f_dec2hex(p_int in varchar2) return varchar2 is
    ----------------------------------------------
    -- 对象名称: f_dec2hex
    -- 对象描述: 十进制转换十六进制
    -- 输入参数: p_str 十进制字符串
    -- 返回结果: 十六进制字符串
    -- 测试用例: select f_dec2hex(45217) from dual;
    /*
    sql> select f_dec2hex(45217) from dual;
 
    f_dec2hex(45217)
    --------------------------------------------
    b0a1
    */
     ----------------------------------------------
    v_return varchar2(4000);
  begin
    select upper(trim(to_char(p_int, 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'))) into v_return from dual;
    return v_return;
  exception
    when others then
      return null;
  end f_dec2hex;


create or replace function f_hex2dec(p_str in varchar2) return varchar2 is
    ----------------------------------------------
    -- 对象名称: f_hex2dec
    -- 对象描述: 十六进制转换十进制
    -- 输入参数: p_str 十六进制字符串
    -- 返回结果: 十进制字符串
    -- 测试用例: select f_hex2dec('b0a1') from dual;
    /*
    sql> select f_hex2dec('b0a1') from dual;
 
    f_hex2dec('b0a1')
    --------------------------------------------
    45217
    */
    ----------------------------------------------
    v_return  varchar2(4000);
  begin
    select sum(data1) into v_return
      from (select (case upper(substr(p_str, 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(p_str, rownum, 1)
                   end) * power(16, length(p_str) - rownum) data1
              from dual
            connect by rownum <= length(p_str));
    return v_return;
  exception
    when others then
      return null;
  end f_hex2dec;

在使用ZHS16GBK的字符集编码数据库中,汉字“啊”的ASCII码就是45217。

SQL> select ascii('啊') from dual;
 
 ASCII('啊')
-----------
      45217


转换成16进制,就是B0A1。它的第一个字节(高位字节)是B0,第二个字节即低位字