首页 > 代码库 > rowid
rowid
- 版本
- rowid是什么
- rowid的种类
- dbms_rowid的应用
版本
首先,我们所讨论的内容是基于以下oracle 版本
SQL> select * from v$version;BANNER------------------------------------------------------------------------------------Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64biPL/SQL Release 10.2.0.5.0 - ProductionCORE 10.2.0.5.0 ProductionTNS for Solaris: Version 10.2.0.5.0 - ProductionNLSRTL Version 10.2.0.5.0 - Production
rowid 是什么
rowid是oracle里面标示row的一种数据结构。每一个表其实都有一个pseduocolumn,叫rowid,通过这个pseduocolumn你就可以查到每一行数据的rowid,如下:
SQL> desc citosadmin.test Name Null? Type ------------------------------------------- -------- ------------------------------ ID1 NUMBER ID2 NUMBER TEXT VARCHAR2(2000)SQL> select id1,id2,text,rowid from citosadmin.test; ID1 ID2 TEXT ROWID---------- ---------- -------- ------------------ 1 1 a AAA86xAAEAAAPAlAAA 2 2 b AAA86xAAEAAAPAlAAB 3 3 c AAA86xAAEAAAPAlAAC
rowid的种类
rowid其实有两种,或者说rowid pseduocolumn这个列有两种数据类型,一种就是rowid,一种是urowid。前一种就是我们普通的rowid,所有普通的表的rowid都是这种类型。后一种urowid叫universal rowid,对应着一些特殊的表,比如index organized table,或者外部表。我们只看普通的rowid。
普通的rowid其实还分为restricted rowid和extended rowid。restricted rowid是oracle 8i之前用的,里面存储的信息包括file number,data block number 和slot。slot是row在data block中的位置。通过这些信息oracle可以迅速定位一个row。extended rowid是oracle 8i开始使用的,因为oracle 8i开始 file number有了两种形式,一种叫绝对的file number,一种叫相对的file number。绝对的file number可以从数据库层面唯一标示一个file而相对的file number只能是在一个表空间内部标示一个file。oracle 8i开始后,在rowid里面存储的信息是相对file number,相对的file number 没办法从数据库层面迅速的定位一个file,所以 8i的rowid又引进一个内容,叫dba_objects.data_object_id(注意和dba_objects.object_id有区别)。通过这个值可以定位一个表空间,进而通过相对相对file number就可以定位到文件。
rowid的结构如下:
struct riddef { ub4 ridobjnum; /* data obj#--this field is unused in restricted ROWIDs */ ub2 ridfilenum; ub1 filler; ub4 ridblocknum; ub2 ridslotnum;}
在restricted rowid中ub4是预留位置,赋值为空。而ub2存储的是绝对的file number。 extended rowid是使用ub4来存储data object id,而ub2存储的是相对 file number。一个要注意的问题是,我们这里提到了data object id ,它在dba_objects中由data_object_id这一列显示,它和object_id是不同的。object_id是标示数据对象的,比如表,而data object id是标示segment的。假如一个表是分区表,那么这个表只有一个object_id但是可以有很多data object id。
dbms_rowid的应用
dbms_rowid是oracle提供的一个pl/sql package。 包含了许多function 和 procedure。下面列出了这些function 和 procedure。 我们知道rowid 会包含relative file number, block number , data object id , slot这些信息。但是直接显示的rowid是一长串数字很难读懂。通过这些function 我们可以轻易的得到其中隐藏的block number, relative file number等信息。
ROWID_BLOCK_NUMBER Function | Returns the block number of a |
ROWID_CREATE Function | Creates a |
ROWID_INFO Procedure | Returns the type and components of a |
ROWID_OBJECT Function | Returns the object number of the extended |
ROWID_RELATIVE_FNO Function | Returns the file number of a |
ROWID_ROW_NUMBER Function | Returns the row number |
ROWID_TO_ABSOLUTE_FNO Function | Returns the absolute file number associated with the |
ROWID_TO_EXTENDED Function | Converts a |
ROWID_TO_RESTRICTED Function | Converts an extended |
ROWID_TYPE Function | Returns the |
ROWID_VERIFY Function | Checks if a |
具体的使用可以参考
http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_rowid.htm#ARPLS053