时间: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)