Oralce中怎么将64进制转换为10进制
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进制的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。