千家信息网

Oracle中通过函数实现二、八、十、十六进制任意转换

发表于:2025-11-08 作者:千家信息网编辑
千家信息网最后更新 2025年11月08日,说明:本文主要参考于: http://www.eygle.com/archives/2004/06/oracle_howto_convert.html一、先创建两个基本的进制转换函数:1.其他进制(2
千家信息网最后更新 2025年11月08日Oracle中通过函数实现二、八、十、十六进制任意转换

说明:本文主要参考于: http://www.eygle.com/archives/2004/06/oracle_howto_convert.html

一、先创建两个基本的进制转换函数:

1.其他进制(2,8,16)转换为十进制

    Create Or Replace Function To_Dec(p_Str       In Varchar2,    --要转换的数字(2,8,16进制)                                      p_From_Base In Number Default 16)    --转换前的进制      Return Number Is      i_Num Number Default 0;      i_Hex Varchar2(16) Default '0123456789ABCDEF';    Begin      For i In 1 .. Length(p_Str) Loop        i_Num := i_Num * p_From_Base + Instr(i_Hex, Upper(Substr(p_Str, i, 1))) - 1;      End Loop;      Return i_Num;    End To_Dec;

2.十进制转换为其它进制(2,8,16)

    Create Or Replace Function To_Base(p_Dec In Number,    --要转换的数字(10进制)                                       p_Base In Number)   --转换后的进制      Return Varchar2 Is      i_Str Varchar2(255) Default Null;      i_Num Number Default p_Dec;      i_Hex Varchar2(16) Default '0123456789ABCDEF';    Begin      If Trunc(p_Dec) <> p_Dec Or p_Dec < 0 Then        Raise Program_Error;      End If;      Loop        i_Str := Substr(i_Hex, Mod(i_Num, p_Base) + 1, 1) || i_Str;        i_Num := Trunc(i_Num / p_Base);        Exit When i_Num = 0;      End Loop;      Return i_Str;    End To_Base;

二、通过上面两个函数,可以将10进制作为转换的中间桥梁。在进行任意进制转换时,都可以先将要转换的进制转为10进 制,然后再通过10进制转换为别的进制。 通过下面函数来实现:

    Create Or Replace Function Bodh_Convert(p_Str  In Varchar2, --要转换的数字(2,8,10,16进制)                                            p_From Number,      --转换前的进制                                            p_To   Number)      --转换后的进制      Return Varchar2 Is      v_Temp Number Default 0;      v_Num  Varchar2(128) Default Null;    Begin      If p_From = 2 Then        If p_To = 8 Then          v_Temp := To_Dec(p_Str, p_From);          v_Num  := To_Base(v_Temp, p_To);        Elsif p_To = 10 Then          v_Num := To_Dec(p_Str, p_From);        Elsif p_To = 16 Then          v_Temp := To_Dec(p_Str, p_From);          v_Num  := To_Base(v_Temp, p_To);        End If;      Elsif p_From = 8 Then        If p_To = 2 Then          v_Temp := To_Dec(p_Str, p_From);          v_Num  := To_Base(v_Temp, p_To);        Elsif p_To = 10 Then          v_Num := To_Dec(p_Str, p_From);        Elsif p_To = 16 Then          v_Temp := To_Dec(p_Str, p_From);          v_Num  := To_Base(v_Temp, p_To);        End If;      Elsif p_From = 10 Then        If p_To = 2 Then          v_Num := To_Base(To_Number(p_Str), p_To);        Elsif p_To = 8 Then          v_Num := To_Base(To_Number(p_Str), p_To);        Elsif p_To = 16 Then          v_Num := To_Base(To_Number(p_Str), p_To);        End If;      Elsif p_From = 16 Then        If p_To = 2 Then          v_Temp := To_Dec(p_Str, p_From);          v_Num  := To_Base(v_Temp, p_To);        Elsif p_To = 8 Then          v_Temp := To_Dec(p_Str, p_From);          v_Num  := To_Base(v_Temp, p_To);        Elsif p_To = 10 Then          v_Num := To_Dec(p_Str, p_From);        End If;      End If;      Return v_Num;    Exception      When Others Then        Dbms_Output.Put_Line('请输入正确的参数');    End Bodh_Convert;

三、示例:

    SQL> select bodh_convert('1111',2,8) from dual;    --2进制转8进制         BODH_CONVERT('1111',2,8)    --------------------------------------------------------------------------------    17         SQL> select bodh_convert('1111',2,10) from dual;    --2进制转10进制         BODH_CONVERT('1111',2,10)    --------------------------------------------------------------------------------    15         SQL> select bodh_convert('1111',2,16) from dual;    --2进制转16进制         BODH_CONVERT('1111',2,16)    --------------------------------------------------------------------------------    F




0