博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Oracle中的Rowid
阅读量:4930 次
发布时间:2019-06-11

本文共 2107 字,大约阅读时间需要 7 分钟。

这篇文章是参考甲骨论老相老师的教学视频
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里面的第几行啦.
 
 

转载于:https://www.cnblogs.com/nvd11/archive/2013/04/02/2996796.html

你可能感兴趣的文章
ural1090 In the Army Now
查看>>
动态逆序对
查看>>
C# using用法
查看>>
Java ActiveMQ 讲解(一)理解JMS 和 ActiveMQ基本使用(转)
查看>>
virtual box 下安装centos 7
查看>>
Sqlserver:动态性能视图:sys.dm_os_wait_stats
查看>>
CSS3圆角详解
查看>>
Linux 内核升级
查看>>
每天进步一点点006
查看>>
【转】简谈基于FPGA的千兆以太网
查看>>
10周机电大作业设计
查看>>
Nginx事件管理之ngx_event_core_module模块
查看>>
mysql修改表、字段、库的字符集(转)
查看>>
多项式三种方法比较
查看>>
程序员过关斩将--你的业务是可变的吗(福利你领了吗)
查看>>
菜鸟入门【ASP.NET Core】11:应用Jwtbearer Authentication、生成jwt token
查看>>
ODP操作procedure
查看>>
关于ie6,7body overflow:hidden失效的问题....
查看>>
【BZOJ】【3524】【POI2014】Couriers
查看>>
Android 通知栏Notification的整合 全面学习 (一个DEMO让你完全了解它)
查看>>