电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

关于扩展(extended)的rowid的一些内容


发布日期:2024/1/22
 

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 :

上一篇:使用Collections

下一篇:禁止网页页面刷新的特效代码