10進位制和16進位制互轉的例子

kewin發表於2011-08-26
10進位制和16進位制互轉
Kevin Zou
2011-8-26

在工作當中常會遇到10進位制和16進位制互轉,比如LATCH的ADDRESS。
在一個latch: cache buffers chains 中,ADDRESS用10進位制記錄,可在V$LATCH_ADDRESS是用RAW,16進位制檢視的。這就要不同進位制之間進行轉換。
10-> 16: to_char
16-> 10: to_number
如這句10046中摘出來的片段:
WAIT #2: nam='latch: cache buffers chains' ela= 7 address=504403174424697944 number=124 tries=0 obj#=-1 tim=51874243369174
這裡address=504403174424697944,那轉為16進位制是:
10-> 16
select to_char(504403174424697944 ,'XXXXXXXXXXXXXXXXXXX') as a from dual;

A
----------------------------------------
     7000003C329DC58

 這裡有個需要注意的地方,需要在在得出的16進位制前加上一個0。
SYS@hr9prd>SELECT addr, latch#, gets, misses, sleeps
  2       FROM v$latch_children  
     WHERE sleeps>0          
     and latch# = 124 and ADDR ='7000003C329DC58'
     ORDER BY sleeps desc;  3    4    5  

no rows selected

Elapsed: 00:00:00.19

SYS@hr9prd>select addr from v$latch_children where rownum < 10;

ADDR
----------------
07000003CA029C40
07000003CA029D00
07000003CA029DC0
07000003CA029E80
07000003CA029F40
07000003CA02A000
07000003C9330F10
07000003C9330FB0
07000003C9331050

9 rows selected.

Elapsed: 00:00:00.19
SYS@hr9prd>SELECT addr, latch#, gets, misses, sleeps
  2       FROM v$latch_children  
     WHERE sleeps>0          
     and latch# = 124 and ADDR ='07000003C329DC58'
     ORDER BY sleeps desc;  3    4    5  

ADDR                 LATCH#       GETS     MISSES     SLEEPS
---------------- ---------- ---------- ---------- ----------
07000003C329DC58        124  746345133     631839       2118

Elapsed: 00:00:00.18

如果知道了RAW地址,求10進位制的地址,可以用to_number 函式。
16-> 10
SYS@hr9prd>col a format 99999999999999999999999999
SYS@hr9prd> select  to_number('7000003C329DC58', 'XXXXXXXXXXXXXXXXXXXXXX')  as a from dual;

                          A
---------------------------
         504403174424697944

Elapsed: 00:00:00.01

需要注意如果轉換後的位數過多,而未能在格式中包括全部的位數,那會報錯:
SYS@hr9prd> select  to_number('7000003C329DC58', 'XXXXXXXXXXXX') from dual;
 select  to_number('7000003C329DC58', 'XXXXXXXXXXXX') from dual
                   *
ERROR at line 1:
ORA-01722: invalid number

總結:
10進位制到16進位制,使用to_char 函式;
16進位制到10進位制,使用to_number函式;

-THE END-

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/40239/viewspace-705910/,如需轉載,請註明出處,否則將追究法律責任。

相關文章