当前位置:Gxlcms > 数据库问题 > oracle进制转换

oracle进制转换

时间:2021-07-01 10:21:17 帮助过:40人阅读

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

--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)

人气教程排行