首页 / ORACLE / oracle进制转换
oracle进制转换
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了oracle进制转换,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含11131字,纯文字阅读大概需要16分钟。
内容图文
![oracle进制转换](/upload/InfoBanner/zyjiaocheng/1235/dee61a019e314c9ea011bdceb63856e7.jpg)
源代码
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 |
原文:http://www.cnblogs.com/iyoume2008/p/6110562.html
内容总结
以上是互联网集市为您收集整理的oracle进制转换全部内容,希望文章能够帮你解决oracle进制转换所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。