rowid的介绍 先对rowid有个感官认识 SQL> select ROWID from Bruce_test where rownum<; ROWID AAABnlAAFAAAAAPAAA ROWID的格式如下 数据对象编号文件编号块编号 行编号 OOOOOO FFFBBBBBBRRR 我们可以看出从上面的rowid可以得知 AAABnl 是数据对象编号 AAF是相关文件编号 AAAAAP是块编号 AAA 是行编号 怎么依据这些编号得到具体的十进制的编码值呢这是经常遇到的问题这里需要明白rowid的是基于位编码的个字符显示(数据对象编号() +文件编号() +块编号()+ 行编号()=位)其中 AZ <==> () az <==> () <==> () +/ <==> () 共位明白这个后就可以计算出进制的编码值计算公式如下 d * (b ^ p) 其中b就是基数这里就是p就是从右到左已开始的位置数 比如上面的例子 文件号AAF具体的计算应该是: *(^)= *(^)= *(^)= 文件号就是++= 刚才提到的是rowid的显示方式基于位编码的个字符显示其实rowid的存储方式是 个字节即位存储其中数据对象编号需要 位相关文件编号需要 位块编号需要位行编号需要 位由此我们可以得出 bit的object number每个数据库最多有G个对象 bit的file number每个对象最多有个文件(个文件预留) bit的block number每个文件最多有M个BLOCK bit的row number每个BLOCK最多有K个ROWS rowid相关的有用的sql 最简单的基于rowid的显示方式得到的响应的位编码对应值的sql select rowid substr(rowid) OBJECT substr(rowid) FILE substr(rowid) BLOCK substr(rowid) ROW from TableName; OWIDOBJECT FILE BLOCKROW AAABcAADAAAGLUAAA AAABc AADAAAGLU AAA AAABcAADAAAGLUAAB AAABc AADAAAGLU AAB AAABcAADAAAGLUAAC AAABc AADAAAGLU AAC AAABcAADAAAGLUAAD AAABc AADAAAGLU AAD AAABcAADAAAGLUAAE AAABc AADAAAGLU AAE 通过dbms_rowid这个包可以直接的得到具体的rowid包含的信息 select dbms_rowidrowid_object(rowid)object_id dbms_rowidrowid_relative_fno(rowid) file_id dbms_rowidrowid_block_number(rowid)block_id dbms_rowidrowid_row_number(rowid)num from bruce_t where rownum<; OBJECT_IDFILE_ID BLOCK_IDNUM
一些使用ROWID的函数 ROWIDTOCHAR(rowid) 将ROWID转换成STRING CHARTOROWID(rowid_string) 将STRING转换成ROWID 另外就是自己写的一些函数(下面的函数是网友eygle提供) create or replace function get_rowid (l_rowid in varchar) return varchar is ls_my_rowid varchar(); rowid_type number; object_number number; relative_fno number; block_number number; row_number number; begin dbms_rowidrowid_info(l_rowidrowid_typeobject_numberrelative_fno block_number row_number); ls_my_rowid := Object# is:||to_char(object_number)||chr()|| Relative_fno is :||to_char(relative_fno)||chr()|| Block number is :||to_char(block_number)||chr()|| Row number is :||to_char(row_number); return ls_my_rowid ; end; / 应用上面的函数如下 SQL> select get_rowid(rowid) name from bruce_t; GET_ROWID(ROWID) NAME Object# is:BruceLau Relative_fno is : Block number is : Row number is : Object# is: MabelTang Relative_fno is : Block number is : Row number is : |