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

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

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

CreateOrReplaceFunctionTo_Dec(p_StrInVarchar2,--要转换的数字(2,8,16进制)p_From_BaseInNumberDefault16)--转换前的进制ReturnNumberIsi_NumNumberDefault0;i_HexVarchar2(16)Default'0123456789ABCDEF';BeginForiIn1..Length(p_Str)Loopi_Num:=i_Num*p_From_Base+Instr(i_Hex,Upper(Substr(p_Str,i,1)))-1;EndLoop;Returni_Num;EndTo_Dec;

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

CreateOrReplaceFunctionTo_Base(p_DecInNumber,--要转换的数字(10进制)p_BaseInNumber)--转换后的进制ReturnVarchar2Isi_StrVarchar2(255)DefaultNull;i_NumNumberDefaultp_Dec;i_HexVarchar2(16)Default'0123456789ABCDEF';BeginIfTrunc(p_Dec)<>p_DecOrp_Dec<0ThenRaiseProgram_Error;EndIf;Loopi_Str:=Substr(i_Hex,Mod(i_Num,p_Base)+1,1)||i_Str;i_Num:=Trunc(i_Num/p_Base);ExitWheni_Num=0;EndLoop;Returni_Str;EndTo_Base;

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

CreateOrReplaceFunctionBodh_Convert(p_StrInVarchar2,--要转换的数字(2,8,10,16进制)p_FromNumber,--转换前的进制p_ToNumber)--转换后的进制ReturnVarchar2Isv_TempNumberDefault0;v_NumVarchar2(128)DefaultNull;BeginIfp_From=2ThenIfp_To=8Thenv_Temp:=To_Dec(p_Str,p_From);v_Num:=To_Base(v_Temp,p_To);Elsifp_To=10Thenv_Num:=To_Dec(p_Str,p_From);Elsifp_To=16Thenv_Temp:=To_Dec(p_Str,p_From);v_Num:=To_Base(v_Temp,p_To);EndIf;Elsifp_From=8ThenIfp_To=2Thenv_Temp:=To_Dec(p_Str,p_From);v_Num:=To_Base(v_Temp,p_To);Elsifp_To=10Thenv_Num:=To_Dec(p_Str,p_From);Elsifp_To=16Thenv_Temp:=To_Dec(p_Str,p_From);v_Num:=To_Base(v_Temp,p_To);EndIf;Elsifp_From=10ThenIfp_To=2Thenv_Num:=To_Base(To_Number(p_Str),p_To);Elsifp_To=8Thenv_Num:=To_Base(To_Number(p_Str),p_To);Elsifp_To=16Thenv_Num:=To_Base(To_Number(p_Str),p_To);EndIf;Elsifp_From=16ThenIfp_To=2Thenv_Temp:=To_Dec(p_Str,p_From);v_Num:=To_Base(v_Temp,p_To);Elsifp_To=8Thenv_Temp:=To_Dec(p_Str,p_From);v_Num:=To_Base(v_Temp,p_To);Elsifp_To=10Thenv_Num:=To_Dec(p_Str,p_From);EndIf;EndIf;Returnv_Num;ExceptionWhenOthersThenDbms_Output.Put_Line('请输入正确的参数');EndBodh_Convert;

三、示例:

SQL>selectbodh_convert('1111',2,8)fromdual;--2进制转8进制BODH_CONVERT('1111',2,8)--------------------------------------------------------------------------------17SQL>selectbodh_convert('1111',2,10)fromdual;--2进制转10进制BODH_CONVERT('1111',2,10)--------------------------------------------------------------------------------15SQL>selectbodh_convert('1111',2,16)fromdual;--2进制转16进制BODH_CONVERT('1111',2,16)--------------------------------------------------------------------------------F