Oracle中通过函数实现二、八、十、十六进制任意转换
说明:本文主要参考于: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
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。