数据库

本类阅读TOP10

·SQL语句导入导出大全
·SQL Server日期计算
·SQL语句导入导出大全
·SQL to Excel 的应用
·Oracle中password file的作用及说明
·MS SQLServer OLEDB分布式事务无法启动的一般解决方案
·sqlserver2000数据库置疑的解决方法
·一个比较实用的大数据量分页存储过程
·如何在正运行 SQL Server 7.0 的服务器之间传输登录和密码
·SQL中两台服务器间使用连接服务器

分类导航
VC语言Delphi
VB语言ASP
PerlJava
Script数据库
其他语言游戏开发
文件格式网站制作
软件工程.NET开发
[tips]关于rowid的一些内容

作者:未知 来源:月光软件站 加入时间:2005-2-28 月光软件站

 

关于rowid的一些内容

 

作者:刘颖博

时间:2004-6-12

mail[email protected],请指正

 

转载请注明出处及作者

 

本文讨论的是关于oracle8i开始引进object的概念后的rowid,即扩展(extended)的rowid

 

1.       rowid的介绍

 

先对rowid有个感官认识:

SQL> select ROWID from Bruce_test where rownum<2;

ROWID
------------------ ----------
AAABnlAAFAAAAAPAAA

 

ROWID的格式如下:

数据对象编号        文件编号        块编号           行编号

OOOOOO             FFF                BBBBBB  RRR

 

我们可以看出,从上面的rowid可以得知:

 

AAABnl 是数据对象编号

AAF是相关文件编号

AAAAAP是块编号

AAA 是行编号

 

怎么依据这些编号得到具体的十进制的编码值呢,这是经常遇到的问题。这里需要明白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就是基数,这里就是64p就是从右到左,已0开始的位置数

比如:上面的例子

文件号AAF,具体的计算应该是:

5*(64^0)=5

0*(64^1)=0

0*(64^2)=0

文件号就是0+0+5=5

 

刚才提到的是rowid的显示方式:基于64位编码的18个字符显示,其实rowid的存储方式是:10 个字节即80位存储,其中数据对象编号32 位,相关文件编号10 位,块编号22,位行编号16 位,由此,我们可以得出:

 

 

 

32bitobject number,每个数据库最多有4G个对象

10bitfile number,每个对象最多有1022个文件(2个文件预留)

22bitblock number,每个文件最多有4MBLOCK

16bitrow number,每个BLOCK最多有64KROWS

 

 

2.       rowid相关的有用的sql

 

 

 

最简单的基于rowid的显示方式得到的响应的64位编码对应值的sql

select rowid ,

substr(rowid,1,6) "OBJECT",

substr(rowid,7,3) "FILE",

substr(rowid,10,6) "BLOCK",

substr(rowid,16,3) "ROW"

from TableName;

 

 

OWID              OBJECT       FILE   BLOCK        ROW

------------------ ------------ ------ ------------ ------

AAABc4AADAAAGLUAAA AAABc4       AAD    AAAGLU       AAA

AAABc4AADAAAGLUAAB AAABc4       AAD    AAAGLU       AAB

AAABc4AADAAAGLUAAC AAABc4       AAD    AAAGLU       AAC

AAABc4AADAAAGLUAAD AAABc4       AAD    AAAGLU       AAD

AAABc4AADAAAGLUAAE AAABc4       AAD    AAAGLU       AAE

 

 

通过dbms_rowid这个包,可以直接的得到具体的rowid包含的信息:
 

select dbms_rowid.rowid_object(rowid)  object_id, dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid)  block_id ,dbms_rowid.rowid_row_number(rowid)  num from bruce_t where rownum<
5;

 

OBJECT_ID    FILE_ID   BLOCK_ID        NUM

---------- ---------- ---------- ----------

      5944          3      25300          0

      5944          3      25300          1

      5944          3      25300          2

      5944          3      25300          3

 

一些使用ROWID的函数
ROWIDTOCHAR(rowid)
:将ROWID转换成STRING
CHARTOROWID('rowid_string')
:将STRING转换成ROWID

 

另外,就是自己写的一些函数:(下面的函数是网友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;          


/

应用上面的函数如下:

SQL> select get_rowid(rowid), name from bruce_t;

GET_ROWID(ROWID)                                                                 NAME

-------------------------------------------------------------------------------- --------------------------------

Object# is      :5944                                                      BruceLau

Relative_fno is :3                                                              

Block number is :25300                                                           

Row number is   :0                                                              

 

Object# is      :5944                                                     MabelTang

Relative_fno is :3                                                               

Block number is :25300                                                          

Row number is   :1                                                              

 

 

 

 




相关文章

相关软件