基础知识:每张表中的每一行数据都具有一个物理地址。一个数据行的地址由以下因素共同确定:
1:对象编号
2:数据文件编号
3:数据块编号
4:数据行在数据文件的地址
rowid使用64进制表示的;
64进制,所用的字符是“0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/”
64进制转10进制:
A-Z 0-25
a-z 26-51
0-9 52-61
+ 62
/ 63
我们查询一张表:
SYS@oracle > select rowid,t.* from t;
ROWID TIME
------------------ --------------
AAAXzRAABAAAZWpAAA 31-7月 -13
AAAXzRAABAAAZWpAAB 03-6月 -13
AAAXzRAABAAAZWpAAC 03-8月 -13
以第一行rowid为例:
AAAXzRAABAAAZWpAAA--64进制
AAAXzR ---对象编号 51*64+23*64*64+17*64^0=97489
AAB ---数据文件编号 0*64^2+0*64^1+1*64^0=1
AAAZWp ---块号 0*64^5+0*64^4+0*64^3+25*64^2+22*64^1+41*60^0=103849
AAA ---行号 0*64^2+0*64^1+0*64^0=0
通过dbms_rowid包获取详细信息;
SYS@oracle > select rowid,dbms_rowid.ROWID_OBJECT(rowid) object_id,
2 dbms_rowid.ROWID_RELATIVE_FNO(rowid) file_id,
3 dbms_rowid.ROWID_BLOCK_NUMBER(rowid) block_num,
4 dbms_rowid.ROWID_ROW_NUMBER(rowid) row_num from t
5 /
ROWID OBJECT_ID FILE_ID BLOCK_NUM ROW_NUM
------------------ ---------- ---------- ---------- ----------
AAAXzRAABAAAZWpAAA 97489 1 103849 0
AAAXzRAABAAAZWpAAB 97489 1 103849 1
AAAXzRAABAAAZWpAAC 97489 1 103849 2
我们也可以通过数据字典获取对象编号:
SYS@oracle > select owner,object_name,data_object_id from dba_objects
2 where owner='SYS' and object_name='T'
3 /
OWNER OBJECT_NAM DATA_OBJECT_ID
---------- ---------- --------------
SYS T 97489
通过查询特定的包与64进制编码计算得出的值是相同的;
结束!
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/25923810/viewspace-1066628/
,如需转载,请注明出处,否则将追究法律责任。