sql转换进制 oracle,oracle进制转换

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

--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) 本条技术文章来源于互联网,如果无意侵犯您的权益请点击此处反馈版权投诉 本文系统来源:http://www.cnblogs.com/iyoume2008/p/6110562.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值