一:什么是oracle rowid
oracle数据库使用rowid用来唯一标示一行。下面来研究一下扩展rowid(extended rowid)。
1:先来认识一下rowid
从查询所得的结果,我们可以感性的认识到rowid共占18位。rowid的结构如图所示。
上图摘自官方文档。我们可以清晰的看到rowid分为四部分。结合上述查询结果,可知:
AAAMfM----------------------->数据对象编号
AAE ------------------------>文件编号
AAAAAg----------------------->块编号
AAA ----------------------->行编号
AAAMfM:六位表示data object id,根据object id可以确定segment。
AAE:三位表示相对文件号。根据该相对文件号可以得到绝对文件号,从而确定datafile。
关于相对文件号和绝对文件号,请参考http://blog.itpub.net/post/330/22749
AAAAAg:六位表示data block number。这里的data block number是相对于datafile的编号,而不是相对于tablespace的编号。
AAA:三位表示row number。
需要明白rowid是基于64位编码的18个字符显示(数据对象编号(6) +文件编号(3) +块编号(6)+ 行编号(3)=18位)
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)
共64位。明白这个后,就可以计算出10进制的编码值,计算公式如下:
d * (b ^ p)
其中:b就是基数,这里就是64,p就是从右到左,以0开始的位置数,d是编码对应的数字。
例如上面的例子:AAAMfMAAEAAAAAgAAA
文件编号:AAE,从右向左。
4*(64^0)=4;
0*(64^1)=0;
0*(64^2)=0;
所以文件编号为:4+0+0=4;为了验证上述计算结果,查询语句如下:
file_id为4,与计算结果一致。
二:与rowid有关的SQL
1:可通过dbms_rowid包获得rowid的详细信息。如:
2:eygle大师写的函数
create or replace function get_rowid
(l_rowid in varchar2)
return varchar2
is
ls_my_rowid varchar2(200);
rowid_type number;
object_number number;
relative_fno number;
block_number number;
row_number number;
begin
dbms_rowid.rowid_info(l_rowid,rowid_type,object_number,relative_fno, block_number, row_number);
ls_my_rowid := 'Object# is :'||to_char(object_number)||chr(10)||
'Relative_fno is :'||to_char(relative_fno)||chr(10)||
'Block number is :'||to_char(block_number)||chr(10)||
'Row number is :'||to_char(row_number);
return ls_my_rowid ;
end;
/