您好,登錄后才能下訂單哦!
說(shuō)明:本文主要參考于: http://www.eygle.com/archives/2004/06/oracle_howto_convert.html
一、先創(chuàng)建兩個(gè)基本的進(jìn)制轉(zhuǎn)換函數(shù):
1.其他進(jìn)制(2,8,16)轉(zhuǎn)換為十進(jìn)制
Create Or Replace Function To_Dec(p_Str In Varchar2, --要轉(zhuǎn)換的數(shù)字(2,8,16進(jìn)制) p_From_Base In Number Default 16) --轉(zhuǎn)換前的進(jìn)制 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.十進(jìn)制轉(zhuǎn)換為其它進(jìn)制(2,8,16)
Create Or Replace Function To_Base(p_Dec In Number, --要轉(zhuǎn)換的數(shù)字(10進(jìn)制) p_Base In Number) --轉(zhuǎn)換后的進(jìn)制 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;
二、通過(guò)上面兩個(gè)函數(shù),可以將10進(jìn)制作為轉(zhuǎn)換的中間橋梁。在進(jìn)行任意進(jìn)制轉(zhuǎn)換時(shí),都可以先將要轉(zhuǎn)換的進(jìn)制轉(zhuǎn)為10進(jìn) 制,然后再通過(guò)10進(jìn)制轉(zhuǎn)換為別的進(jìn)制。 通過(guò)下面函數(shù)來(lái)實(shí)現(xiàn):
Create Or Replace Function Bodh_Convert(p_Str In Varchar2, --要轉(zhuǎn)換的數(shù)字(2,8,10,16進(jìn)制) p_From Number, --轉(zhuǎn)換前的進(jìn)制 p_To Number) --轉(zhuǎn)換后的進(jìn)制 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('請(qǐng)輸入正確的參數(shù)'); End Bodh_Convert;
三、示例:
SQL> select bodh_convert('1111',2,8) from dual; --2進(jìn)制轉(zhuǎn)8進(jìn)制 BODH_CONVERT('1111',2,8) -------------------------------------------------------------------------------- 17 SQL> select bodh_convert('1111',2,10) from dual; --2進(jìn)制轉(zhuǎn)10進(jìn)制 BODH_CONVERT('1111',2,10) -------------------------------------------------------------------------------- 15 SQL> select bodh_convert('1111',2,16) from dual; --2進(jìn)制轉(zhuǎn)16進(jìn)制 BODH_CONVERT('1111',2,16) -------------------------------------------------------------------------------- F
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。