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)简化了我们的操作:
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>
行地址类型 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
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>