rowid 解析

Rowid 

行地址类型 1.数据类型 2.伪列(选出来的是行地址[物理的角度定位的方法])
受限的rowid  15位
拓展的rowid 18位  (obj#+file#+block#+row#) 6363分组

一个表空间容纳1022个数据文件,一个数据库最多1022表空间
每一行在数据库中有一个地址称为ROWID

查看的方法是使用伪列的形式:ROWID,用户在查看表的结构时不会看到ROWID字段.
但和其他字段一样,可以在执行SELECT操作时直接引用
在引用ROWID时通常可以使用DBMS_ROWID包将其转变为可读取的内容。

ROWID 又分为 受限制的ROWID和 扩展的ROWID两类:
受限ROWID已经在 8I 时被拓展ROWID取代 ,取代的原因是使用这个ROWID导致整个数据库只能有1022个数据文件。
拓展ROWID 又引入了对象号 受限ROWID中的文件号 也变成了相对文件号。
这就使原来的数据库的1022个数据文件转变成了一个表空间内1022个数据文件

这里我们只做拓展ROWID介绍:
SQL> select ename,rowid from emp where ename='SCOTT';

ENAME        ROWID
---------- ------------------
SCOTT        AAAMfMAAEAAAAAgAAH

     AAAMfMAAEAAAAAgAAH 即是soctt这条记录的ROWID
     由 18位 64进制数组成 。把它 6363 分组
               AAAMfM   AAE   AAAAAg   AAH
对应上图OFBR     OOOOOO   FFF   BBBBBB   RRR

64进制组成符号:
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
a b c d e f g h i j k l m n o p q r s t u v w x y z
0 1 2 3 4 5 6 7 8 9
+ /

A-Z 对应 0-25
a-z 对应 26-51
0-9 对应 52-61
+ / 对应 62 63


AAAMfM  转换对应值 0 0 0 12  31  12     对象号
AAE     转换对应值 0 0  4          文件号
AAAAAg  转换对应值 0 0 0 0 0  32          块号
AAH     转换对应值 00  7          行号

SQL> select 12*power(64,2) + 31*64 + 12 as "object#" from dual;     --对象号 64进制转为 10进制

   object#
----------
     51148

SQL> select  object_id from all_objects where object_name='EMP';          --确认算出来的结果就是 对象号!

OBJECT_ID
----------
     51148

SQL> select 4 as "file#" from dual;

     file#
----------
     4

SQL> select 32 as "block#" from dual;

    block#
----------
     32

SQL>conn / as sysdba
SQL> select SEGMENT_NAME,FILE_ID,BLOCK_ID,blocks from dba_extents where SEGMENT_NAME='EMP';

SEGMENT_NAME FILE_ID   BLOCK_ID     BLOCKS
-------------------- ---------- ---------- ----------
EMP                          4         25         8

SQL> select 25+8 from dual;

      25+8
----------
     33

块号 32# 就在25-33之间 一个文件创建时预分配8个块

SQL> select 7 as "row#" from dual;

      row#
----------
     7

--oracle为了演算ROWID,提供了一个包( dbms_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     ---返回该行数据在BLOCK中的相对位置
from scott.emp where ename='SCOTT';

OBJECT_ID    FILE_ID     BLOCK_ID     NUM
---------- ---------- ---------- ----------
     51148         4           32       7


同时也提供ROWID的逆算
SQL> desc dbms_rowid
FUNCTION ROWID_CREATE RETURNS ROWID
Argument Name               Type               In/Out Default?
------------------------------ ----------------------- ------ --------
ROWID_TYPE               NUMBER               IN
OBJECT_NUMBER               NUMBER               IN
RELATIVE_FNO               NUMBER               IN
BLOCK_NUMBER               NUMBER               IN
ROW_NUMBER               NUMBER               IN

SQL> select dbms_rowid.ROWID_CREATE(1,51148,4,32,7) from dual;

DBMS_ROWID.ROWID_C
------------------
AAAMfMAAEAAAAAgAAH    

create table t7 (r rowid);
insert into t7 values('AAAMfMAAEAAAAAgAAH');

SQL> insert into t7 values('AAA');
insert into t7 values('AAA')
                      *
ERROR at line 1:
ORA-01410: invalid ROWID


SQL> SELECT * FROM T7;

R
------------------
AAAMfMAAEAAAAAgAAH

SQL> 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值