Oralce中怎么将64进制转换为10进制,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

1.实现函

CreateOrReplaceFunctionSf_To_Deci(StrInVarchar2)ReturnNumberAsDigitNumber(32);BeginSelectSum(Data)IntoDigitFrom(Select(CaseWhenAscii(Substr(Str,Rownum,1))=43Then62WhenAscii(Substr(Str,Rownum,1))=47Then63WhenAscii(Substr(Str,Rownum,1))Between48And57ThenAscii(Substr(Str,Rownum,1))+4WhenAscii(Substr(Str,Rownum,1))Between65And90ThenAscii(Substr(Str,Rownum,1))-65WhenAscii(Substr(Str,Rownum,1))Between97And122ThenAscii(Substr(Str,Rownum,1))-71ElseNullEnd)*Power(64,Length(Str)-Rownum)DataFromDualConnectByRownum<=Length(Str));ReturnDigit;End;

2.64进制基数

A-Z(0-25),a-z(26-51),0-9(52-61),+(62),/(63)

3.实现原理

通过字符对应的ASCII值与实际表示的64进制值进行换算,以此来减少判断分类。换算关系如下:

A~Z65~90-65=0~25a~z97~122-71=26~510~948~57+4=52~61+43+19=62/47+16=63

4.应用

rowid是用64进制来表示的,它的组成:数据对象号(6位)+相对文件号(3位)+数据块号(6位)+在数据块中的行数(3位)。

Oracle包dbms_rowid中提供了使用rowid来查询其信息的函数,如下所示:

selectrowid,dbms_rowid.rowid_object(rowid)object_id,--51366(AAAMim)AAFAAAAAMAAC数据对象号dbms_rowid.rowid_relative_fno(rowid)file_id,--5AAAMim(AAF)AAAAAMAAC相对文件号dbms_rowid.rowid_block_number(rowid)block_id,--12AAAMimAAF(AAAAAM)AAC在第几个块dbms_rowid.rowid_row_number(rowid)num--2AAAMimAAFAAAAAM(AAC)在block中的行数fromtestwhererowid='AAAMimAAFAAAAAMAAC';

下面这个函数对上面的函数改造后可以一次性返回这些信息

CreateOrReplaceFunctionRowid_To_Info(StrInVarchar2)ReturnVarchar2AsDigitVarchar2(32);RestVarchar2(400);Str_1Varchar2(10):=Substr(Str,1,6);Str_2Varchar2(10):=Substr(Str,7,3);Str_3Varchar2(10):=Substr(Str,10,6);Str_4Varchar2(10):=Substr(Str,16,3);TypeStr_VarrayIsVarray(4)OfVarchar2(10);TypeRest_VarrayIsVarray(4)OfVarchar2(20);v_Str_VarrayStr_Varray:=Str_Varray(Str_1,Str_2,Str_3,Str_4);v_Rest_VarrayRest_Varray:=Rest_Varray('Object_id:','File_id:','Block_id:','Block_num:');BeginForiIn1..4LoopSelectSum(Data)IntoDigitFrom(Select(CaseWhenAscii(Substr(v_Str_Varray(i),Rownum,1))=43Then62WhenAscii(Substr(v_Str_Varray(i),Rownum,1))=47Then63WhenAscii(Substr(v_Str_Varray(i),Rownum,1))Between48And57ThenAscii(Substr(v_Str_Varray(i),Rownum,1))+4WhenAscii(Substr(v_Str_Varray(i),Rownum,1))Between65And90ThenAscii(Substr(v_Str_Varray(i),Rownum,1))-65WhenAscii(Substr(v_Str_Varray(i),Rownum,1))Between97And122ThenAscii(Substr(v_Str_Varray(i),Rownum,1))-71ElseNullEnd)*Power(64,Length(v_Str_Varray(i))-Rownum)DataFromDualConnectByRownum<=Length(v_Str_Varray(i)));Ifi=4ThenRest:=Rest||v_Rest_Varray(i)||Digit;ElseRest:=Rest||v_Rest_Varray(i)||Digit||chr(9);EndIf;EndLoop;ReturnRest;End;

查询:

SQL>selectrowid_to_info('AAAMimAAFAAAAAMAAC')fromdual;ROWID_TO_INFO('AAAMIMAAFAAAAAMAAC')--------------------------------------------------------------------------------Object_id:51366File_id:5Block_id:12Block_num:2

看完上述内容,你们掌握Oralce中怎么将64进制转换为10进制的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!