oracle进制转换

 

源代码

CREATE OR REPLACE PACKAGE Base_Num_Change IS

  --=============================================

  --1.0 16进制转10进制

  FUNCTION Hex_To_Dec(p_Str VARCHAR2) RETURN NUMBER;

  --1.1 16进制转8进制

  FUNCTION Hex_To_Oct(p_Str VARCHAR2) RETURN VARCHAR2;

  --1.2 16进制转2进制

  FUNCTION Hex_To_Bin(p_Str VARCHAR2) RETURN VARCHAR2;

  --2.0 10进制转16进制

  FUNCTION Dec_To_Hex(p_Dec NUMBER) RETURN VARCHAR2;

  --2.1 10进制转8进制

  FUNCTION Dec_To_Oct(p_Dec NUMBER) RETURN VARCHAR2;

  --2.2 10进制转2进制

  FUNCTION Dec_To_Bin(p_Dec NUMBER) RETURN VARCHAR2;

  --3.0 8进制转16进制

  FUNCTION Oct_To_Hex(p_Str VARCHAR2) RETURN VARCHAR2;

  --3.1 8进制转10进制

  FUNCTION Oct_To_Dec(p_Str VARCHAR2) RETURN NUMBER;

  --3.2 8进制转2进制

  FUNCTION Oct_To_Bin(p_Str VARCHAR2) RETURN VARCHAR2;

  --4.0 2进制转16进制

  FUNCTION Bin_To_Hex(p_Str VARCHAR2) RETURN VARCHAR2;

  --4.1 2进制转10进制

  FUNCTION Bin_To_Dec(p_Str VARCHAR2) RETURN NUMBER;

  --4.2 2进制转8进制

  FUNCTION Bin_To_Oct(p_Str VARCHAR2) RETURN VARCHAR2;

 

END Base_Num_Change;

/

CREATE OR REPLACE PACKAGE BODY Base_Num_Change IS

  --=============================================

  --1.0 16进制转10进制

  FUNCTION Hex_To_Dec(p_Str VARCHAR2) RETURN NUMBER AS

    p_Len     NUMBER(9);

    p_Char    VARCHAR2(1);

    p_Sub_Out NUMBER(3);

    p_Sub_Str VARCHAR2(200) := Upper(p_Str);

    p_Out     NUMBER(18) := 0;

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    IF p_Str IS NULL

    THEN

      RETURN NULL;

    END IF;

    IF Ltrim(p_Sub_Str, '0123456789ABCDEF') IS NOT NULL

    THEN

      p_Errstr := p_Str || '包含非法字符,无法转换为2进制!';

      RAISE p_Integrity;

    END IF;

    --得到基本数据

    p_Len := Length(p_Str);

    FOR i IN 1 .. p_Len

    LOOP

      p_Char := Substr(p_Sub_Str, 1, 1);

      SELECT Decode(p_Char,

                    'A',

                    10,

                    'B',

                    11,

                    'C',

                    12,

                    'D',

                    13,

                    'E',

                    14,

                    'F',

                    15,

                    To_Number(p_Char))

        INTO p_Sub_Out

        FROM Dual;

      p_Sub_Str := Substr(p_Sub_Str, 2);

      p_Out     := p_Out * 16 + p_Sub_Out;

    END LOOP;

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Hex_To_Dec;

  --1.1 16进制转8进制

  FUNCTION Hex_To_Oct(p_Str VARCHAR2) RETURN VARCHAR2 AS

    p_Out VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    --得到基本数据

    p_Out := Bin_To_Oct(Hex_To_Bin(p_Str));

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Hex_To_Oct;

 

  --1.2 16进制转2进制

  FUNCTION Hex_To_Bin(p_Str VARCHAR2) RETURN VARCHAR2 AS

    p_Len     NUMBER(9);

    p_Char    VARCHAR2(1);

    p_Sub_Out VARCHAR2(4);

    p_Sub_Str VARCHAR2(200) := Upper(p_Str);

    p_Out     VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    IF p_Str IS NULL

    THEN

      RETURN NULL;

    END IF;

    IF Ltrim(p_Sub_Str, '0123456789ABCDEF') IS NOT NULL

    THEN

      p_Errstr := p_Str || '包含非法字符,无法转换为2进制!';

      RAISE p_Integrity;

    END IF;

    --得到基本数据

    p_Len := Length(p_Str);

    FOR i IN 1 .. p_Len

    LOOP

      p_Char := Substr(p_Sub_Str, 1, 1);

      SELECT Decode(p_Char,

                    '0',

                    '0000',

                    '1',

                    '0001',

                    '2',

                    '0010',

                    '3',

                    '0011',

                    '4',

                    '0100',

                    '5',

                    '0101',

                    '6',

                    '0110',

                    '7',

                    '0111',

                    '8',

                    '1000',

                    '9',

                    '1001',

                    'A',

                    '1010',

                    'B',

                    '1011',

                    'C',

                    '1100',

                    'D',

                    '1101',

                    'E',

                    '1110',

                    'F',

                    '1111',

                    '2222')

        INTO p_Sub_Out

        FROM Dual;

      p_Sub_Str := Substr(p_Sub_Str, 2);

      p_Out     := p_Out || p_Sub_Out;

    END LOOP;

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Hex_To_Bin;

 

  --2.0 10进制转16进制

  FUNCTION Dec_To_Hex(p_Dec NUMBER) RETURN VARCHAR2 AS

    p_Out VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    --得到基本数据

    p_Out := Bin_To_Hex(Dec_To_Bin(p_Dec));

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Dec_To_Hex;

  --2.1 10进制转8进制

  FUNCTION Dec_To_Oct(p_Dec NUMBER) RETURN VARCHAR2 AS

    p_Out VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    --得到基本数据

    p_Out := Bin_To_Oct(Dec_To_Bin(p_Dec));

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Dec_To_Oct;

  --2.2 10进制转2进制

  FUNCTION Dec_To_Bin(p_Dec NUMBER) RETURN VARCHAR2 AS

    p_Sub_Out VARCHAR2(4);

    p_Sub_Dec NUMBER(18) := p_Dec;

    p_Out     VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    IF p_Dec IS NULL

    THEN

      RETURN NULL;

    END IF;

    IF Trunc(p_Dec) <> p_Dec

    THEN

      p_Errstr := p_Dec || '不是整数,无法转换为2进制!';

      RAISE p_Integrity;

    END IF;

 

    LOOP

      p_Sub_Out := MOD(p_Sub_Dec, 2);

      p_Sub_Dec := Trunc(p_Sub_Dec / 2);

      p_Out     := p_Sub_Out || p_Out;

      EXIT WHEN(p_Sub_Dec = 0);

    END LOOP;

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Dec_To_Bin;

  --3.0 8进制转16进制

  FUNCTION Oct_To_Hex(p_Str VARCHAR2) RETURN VARCHAR2 AS

    p_Out VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    --得到基本数据

    p_Out := Bin_To_Hex(Oct_To_Bin(p_Str));

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Oct_To_Hex;

  --3.1 8进制转10进制

  FUNCTION Oct_To_Dec(p_Str VARCHAR2) RETURN NUMBER AS

    p_Len     NUMBER(9);

    p_Char    VARCHAR2(1);

    p_Sub_Out NUMBER(3);

    p_Sub_Str VARCHAR2(200) := Upper(p_Str);

    p_Out     NUMBER(18) := 0;

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    IF p_Str IS NULL

    THEN

      RETURN NULL;

    END IF;

    IF Ltrim(p_Sub_Str, '01234567') IS NOT NULL

    THEN

      p_Errstr := p_Str || '包含非法字符,无法转换为2进制!';

      RAISE p_Integrity;

    END IF;

    --得到基本数据

    p_Len := Length(p_Str);

    FOR i IN 1 .. p_Len

    LOOP

      p_Char    := Substr(p_Sub_Str, 1, 1);

      p_Sub_Out := To_Number(p_Char);

      p_Sub_Str := Substr(p_Sub_Str, 2);

      p_Out     := p_Out * 8 + p_Sub_Out;

    END LOOP;

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Oct_To_Dec;

  --3.2 8进制转2进制

  FUNCTION Oct_To_Bin(p_Str VARCHAR2) RETURN VARCHAR2 AS

    p_Len     NUMBER(9);

    p_Char    VARCHAR2(1);

    p_Sub_Out VARCHAR2(4);

    p_Sub_Str VARCHAR2(200) := Upper(p_Str);

    p_Out     VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    IF p_Str IS NULL

    THEN

      RETURN NULL;

    END IF;

    IF Ltrim(p_Sub_Str, '01234567') IS NOT NULL

    THEN

      p_Errstr := p_Str || '包含非法字符,无法转换为2进制!';

      RAISE p_Integrity;

    END IF;

    --得到基本数据

    p_Len := Length(p_Str);

    FOR i IN 1 .. p_Len

    LOOP

      p_Char := Substr(p_Sub_Str, 1, 1);

      SELECT Decode(p_Char,

                    '0',

                    '000',

                    '1',

                    '001',

                    '2',

                    '010',

                    '3',

                    '011',

                    '4',

                    '100',

                    '5',

                    '101',

                    '6',

                    '110',

                    '7',

                    '111',

                    '222')

        INTO p_Sub_Out

        FROM Dual;

      p_Sub_Str := Substr(p_Sub_Str, 2);

      p_Out     := p_Out || p_Sub_Out;

    END LOOP;

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Oct_To_Bin;

  --4.0 2进制转16进制

  FUNCTION Bin_To_Hex(p_Str VARCHAR2) RETURN VARCHAR2 AS

    p_Len     NUMBER(9);

    p_Char    VARCHAR2(4);

    p_Sub_Out VARCHAR2(4);

    p_Sub_Str VARCHAR2(200) := Upper(p_Str);

    p_Out     VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    IF p_Str IS NULL

    THEN

      RETURN NULL;

    END IF;

    IF Ltrim(p_Sub_Str, '01') IS NOT NULL

    THEN

      p_Errstr := p_Str || '包含非法字符,无法转换为16进制!';

      RAISE p_Integrity;

    END IF;

    --得到基本数据

    p_Len := Ceil(Length(p_Str) / 4);

    FOR i IN 1 .. p_Len

    LOOP

      p_Char := Lpad(Substr(p_Sub_Str,(CASE WHEN Length(p_Str) + 1 - 4 * i > 1 THEN Length(p_Str) + 1 - 4 * i ELSE 1 END)), 4, '0');

      SELECT Decode(p_Char,

                    '0000',

                    '0',

                    '0001',

                    '1',

                    '0010',

                    '2',

                    '0011',

                    '3',

                    '0100',

                    '4',

                    '0101',

                    '5',

                    '0110',

                    '6',

                    '0111',

                    '7',

                    '1000',

                    '8',

                    '1001',

                    '9',

                    '1010',

                    'A',

                    '1011',

                    'B',

                    '1100',

                    'C',

                    '1101',

                    'D',

                    '1110',

                    'E',

                    '1111',

                    'F',

                    'G')

        INTO p_Sub_Out

        FROM Dual;

      p_Sub_Str := Substr(p_Sub_Str, 1, Length(p_Sub_Str) - 4);

      p_Out     := p_Sub_Out || p_Out;

    END LOOP;

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Bin_To_Hex;

  --4.1 2进制转10进制

  FUNCTION Bin_To_Dec(p_Str VARCHAR2) RETURN NUMBER AS

    p_Len     NUMBER(9);

    p_Char    VARCHAR2(1);

    p_Sub_Out NUMBER(3);

    p_Sub_Str VARCHAR2(200) := Upper(p_Str);

    p_Out     NUMBER(18) := 0;

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    IF p_Str IS NULL

    THEN

      RETURN NULL;

    END IF;

    IF Ltrim(p_Sub_Str, '01') IS NOT NULL

    THEN

      p_Errstr := p_Str || '包含非法字符,无法转换为10进制!';

      RAISE p_Integrity;

    END IF;

    --得到基本数据

    p_Len := Length(p_Str);

    FOR i IN 1 .. p_Len

    LOOP

      p_Char    := Substr(p_Sub_Str, 1, 1);

      p_Sub_Out := To_Number(p_Char);

      p_Sub_Str := Substr(p_Sub_Str, 2);

      p_Out     := p_Out * 2 + p_Sub_Out;

    END LOOP;

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Bin_To_Dec;

  --4.2 2进制转8进制

  FUNCTION Bin_To_Oct(p_Str VARCHAR2) RETURN VARCHAR2 AS

    p_Len     NUMBER(9);

    p_Char    VARCHAR2(3);

    p_Sub_Out VARCHAR2(4);

    p_Sub_Str VARCHAR2(200) := Upper(p_Str);

    p_Out     VARCHAR2(2000);

    p_Integrity EXCEPTION;

    p_Errstr VARCHAR2(200);

  BEGIN

    IF p_Str IS NULL

    THEN

      RETURN NULL;

    END IF;

    IF Ltrim(p_Sub_Str, '01') IS NOT NULL

    THEN

      p_Errstr := p_Str || '包含非法字符,无法转换为8进制!';

      RAISE p_Integrity;

    END IF;

    --得到基本数据

    p_Len := Ceil(Length(p_Str) / 3);

    FOR i IN 1 .. p_Len

    LOOP

      p_Char := Lpad(Substr(p_Sub_Str,(CASE WHEN Length(p_Str) + 1 - 3 * i > 1 THEN Length(p_Str) + 1 - 3 * i ELSE 1 END)), 3, '0');

      SELECT Decode(p_Char,

                    '000',

                    '0',

                    '001',

                    '1',

                    '010',

                    '2',

                    '011',

                    '3',

                    '100',

                    '4',

                    '101',

                    '5',

                    '110',

                    '6',

                    '111',

                    '7',

                    '9')

        INTO p_Sub_Out

        FROM Dual;

      p_Sub_Str := Substr(p_Sub_Str, 1, Length(p_Sub_Str) - 3);

      p_Out     := p_Sub_Out || p_Out;

    END LOOP;

    --

    RETURN p_Out;

  EXCEPTION

    WHEN p_Integrity THEN

      Raise_Application_Error(-20001, p_Errstr);

  END Bin_To_Oct;

 

END Base_Num_Change;

 

/

 16进制转10进制

SQL> select Base_Num_Change.Hex_To_Dec('ABC') from dual;

 

BASE_NUM_CHANGE.HEX_TO_DEC('ABC')

---------------------------------

            2748

 10进制转2进制

SQL> select Base_Num_Change.Dec_To_Bin(2748) from dual;

 

BASE_NUM_CHANGE.DEC_TO_BIN(2748)

-------------------------------------------------------------------------------------------------

101010111100

 2进制转10进制

SQL> select Base_Num_Change.Bin_To_Dec(101010111100) from dual;

 

BASE_NUM_CHANGE.BIN_TO_DEC(101010111100)

----------------------------------------

                                    2748

 2进制转16进制

 

SQL> select Base_Num_Change.Bin_To_Hex(101010111100) from dual;

 

BASE_NUM_CHANGE.BIN_TO_HEX(101010111100)

-------------------------------------------------------------------------------------------------

ABC

其实,Oracle自带函数 to_number(),就可以搞定

 

SQL> select to_number('ABC','XXX') from dual;

 

TO_NUMBER('ABC','XXX')

      2748

 10进制转16进制

SQL> select Base_Num_Change.Dec_To_Hex(2748) from dual;

 

BASE_NUM_CHANGE.DEC_TO_HEX(2748)

-------------------------------------------------------------------------------------------------

ABC

 

其实,Oracle自带to_char()函数

 

SQL> select to_char('2748','XXX') from dual;

 

TO_C

----

 ABC

 16进制转2进制

SQL> select Base_Num_Change.Hex_To_Bin('ABC') from dual;

 

BASE_NUM_CHANGE.HEX_TO_BIN('ABC')

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

101010111100

 

                                  

创建时间:2022-04-02 15:00
浏览量:0