rowid

版本

首先,我们所讨论的内容是基于以下oracle 版本

SQL> select * from v$version;

BANNER
------------------------------------------------------------------------------------
Oracle Database 10g Enterprise Edition Release 10.2.0.5.0 - 64bi
PL/SQL Release 10.2.0.5.0 - Production
CORE    10.2.0.5.0      Production
TNS for Solaris: Version 10.2.0.5.0 - Production
NLSRTL Version 10.2.0.5.0 - Production
View Code

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
View Code

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

ROWID_CREATE Function

Creates a ROWID, for testing only

ROWID_INFO Procedure

Returns the type and components of a ROWID

ROWID_OBJECT Function

Returns the object number of the extended ROWID

ROWID_RELATIVE_FNO Function

Returns the file number of a ROWID

ROWID_ROW_NUMBER Function

Returns the row number

ROWID_TO_ABSOLUTE_FNO Function

Returns the absolute file number associated with the ROWID for a row in a specific table

ROWID_TO_EXTENDED Function

Converts a ROWID from restricted format to extended

ROWID_TO_RESTRICTED Function

Converts an extended ROWID to restricted format

ROWID_TYPE Function

Returns the ROWID type: 0 is restricted, 1 is extended

ROWID_VERIFY Function

Checks if a ROWID can be correctly extended by the ROWID_TO_EXTENDED function

具体的使用可以参考

http://docs.oracle.com/cd/B19306_01/appdev.102/b14258/d_rowid.htm#ARPLS053

原文地址:https://www.cnblogs.com/kramer/p/3807712.html