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/,如需转载,请注明出处,否则将追究法律责任。