联系:QQ(5163721)
标题:根据一个给定的rowid手工推算他的file#,block#,obj#,row#
作者:Lunar©版权所有[文章允许转载,但必须以链接方式注明源地址,否则追究法律责任.]
从Oracle 8i开始使用扩展rowid标识行物理地址,扩展rowid使用base64编码行的物理地址,编码字符包含A-Z, a-z, 0-9, +, 和/。
扩展rowid由四部分组成:OOOOOOOFFFBBBBBBRRR。其中:
	OOOOOO:数据对象编号(6位显示)
	FFF:相关数据文件编号(3位显示)
	BBBBBB:数据块编号(6位显示)
	RRR:数据块中行编号(3位显示)
	8i以后,rowid采用base64编码(基于64位的编码)的扩展rowid.
.
关于64bit编码表,可以搜索Google或者Baidu,关键字“Base64编码表”。

将64位编码转换为十进制:
file#: AAB —–> 0 0 1 —–>0*64^2+0*64^1+1*64^0 =1
block#: AAAAMh —–> 0 0 0 0 12 33 —–>0*64^5+0*64^4+0*64^3+0*64^2+12*64^1+33*64^0 =801
obj#: AAAABi —–> 0 0 0 0 1 34 —–>0*64^5+0*64^4+0*64^3+0*64^2+1*64^1+34*64^0 =98
row#:AAf —–> 0 0 31 —–>0*64^2+0*64^4+0*64^1+31*64^0 =31
注意这里,row#是31行(我的环境是Oracle 11.2.0.3),记住row#是从0开始计数的,这个是固定位置(10g中是第25行)
验证一下:
SYS@lunarp>select rownum,substr(rowid,1,6) “object”,
  2  substr(rowid,7,3) “file”,
  3  substr(rowid,10,6) “block”,
  4  substr(rowid,16,3) “row”
  5  from props$
  6  where name = ‘GLOBAL_DB_NAME’;
    ROWNUM object                   file         block                    row
———- ———————— ———— ———————— ————
         1 AAAABi                   AAB          AAAAMh                   AAf
Elapsed: 00:00:00.01
SYS@lunarp>select distinct dbms_rowid.rowid_relative_fno(rowid) file#,
  2  dbms_rowid.rowid_block_number(rowid) blk#,
  3  dbms_rowid.rowid_object(rowid) obj#,
  4  dbms_rowid.rowid_row_number(rowid) row#
  5  from props$
  6  where name = ‘GLOBAL_DB_NAME’;
     FILE#       BLK#       OBJ#       ROW#
———- ———- ———- ———-
         1        801         98         31
Elapsed: 00:00:00.02
SYS@lunarp>
data_block_dump,data header at 0x76fa205c
===============
tsiz: 0x1fa0
hsiz: 0x5a
pbl: 0x76fa205c
     76543210
flag=——–
ntab=1
nrow=36
frre=-1
fsbo=0x5a
fseo=0x16b4
avsp=0x1798
tosp=0x179f
 
								 
 
 
 
 
