Oracle中的Rowid

这篇文章是参考甲骨论老相老师的教学视频
http://v.youku.com/v_show/id_XMzkyMjE3NTA0.html
所做的学习笔记。


1.什么是Rowid

这里的Rowid,并不是1条数据行在表中的编号的意思.

而是指Table中某一条数据行在数据文件中的物理地址,

而我们可以根据这个物理地址获得这一行数据行的数据在几号数据文件中的第几个block里面的的第几行等信息.

可以用select rowid,* from Table语句来获得rowid的值.


下面举个列子

2.创建1张表

语句如下:

create table T_rowid (
    a int,
    b varchar2(4000) default rpad('*',4000,'*'),
        c varchar2(3000) default rpad('*',3000,'*')
)
/

注意上面rpad('*',4000,'*')的意思就是4000个 *啦
Oracle中的Rowid - 饥民 - 饥民2011
 


3.插入删除更新数据等一系列操作..
   语句如下:
insert into T_rowid(a) values (1);

insert into T_rowid(a) values (2);

insert into T_rowid(a) values (3);

delete from T_rowid where a = 2;

insert into T_rowid(a) values (4);
commit;
/

Oracle中的Rowid - 饥民 - 饥民2011
 
                                                                                                                                                                  
可以见到我是先插入a=2的行,然后把它delete了, 再插入a=4的行.    跟着就commit了.
                                                                                                                                                                  
4.接下来查看这张表数据行的Rowid                                                                                                                                  
     Oracle有个dbms.rowid 系统包, 可以用于查看rowid的信息
如下图:

Oracle中的Rowid - 饥民 - 饥民2011
 
    好明显, 见到顺序来讲, 后插入的"4" 的rowid 会比 先插入的"3"那一行要前.
    原因也很简单,  因为在commit之前,  用户对表数据所有操作都是在buffer cache里进行的, 这个例子中, 一开始Insert了3行数据到buffer cache里的3个buffer中,  后来将第2行删除了,  接下来插入的等4行被放入了第2行原来的buffer中. 最后commit, DBWR会将3个buffer写入到dbf中的3个block中. 

     但是, 上面196,197,198并不是就是对应3行数据的rowid,  看函数名就知道,指的是rowid对应在dbf文件中的block号码..

     要获取rowid上面已经提过啦, 要用rowid这个列.

Oracle中的Rowid - 饥民 - 饥民2011

如上图那一坨字符就是真正的rowid了.

5.写1个函数get_rowid_info来查看对应的信息.
 
    如上图了, 只获取rowid是没什么意义的, 还要借助其他工具来查看该rowid对应的信息, 其中1个很重要的工具就死后DBMS_ROWID这个包啦.

      我们也可以利用dbms_rowid这个包自己写1个函数get_rowid_info来获得更多的rowid信息.

create or replace function get_rowid_info(v_rowid in varchar2)
return varchar2
is


v_my_rowid varchar2(200);
n_rowid_type number;
n_obj_number number;
n_relative_info number;
n_block_number number;
n_row_number number;

begin
        dbms_rowid.rowid_info(v_rowid,n_rowid_type,n_obj_number,n_relative_info,n_block_number,n_row_number);
        v_my_rowid := 'Object# is       : ' || to_char(n_obj_number) || chr(10) ||
                      'Relative_info is : ' || to_char(n_relative_info) || chr(10) ||
                      'Block number is  : ' || to_char(n_block_number) || chr(10) ||
                      'Row number is    : ' || to_char(n_row_number);
        return v_my_rowid;
end;
/

Oracle中的Rowid - 饥民 - 饥民2011
 

然后我们试下执行,  参数就选上面T_rowid表中, a=4那行数据啦, rowid= 'AAASOeAAEAAAADFAAB'
Oracle中的Rowid - 饥民 - 饥民2011

其中Object#就是 表T_rowid的object_id啦:
Oracle中的Rowid - 饥民 - 饥民2011
 
 而Relative_info = 4是指这个rowid在第4号数据文件中
Oracle中的Rowid - 饥民 - 饥民2011

而block number就是该block在上面数据文件中的编号啦.

row number 就是在这block里面的第几行啦.


 

 





























posted @ 2013-04-02 00:57  Gateman  阅读(176)  评论(0编辑  收藏  举报