这篇文章是参考甲骨论老相老师的教学视频
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个 *啦


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;
/

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

好明显, 见到顺序来讲, 后插入的"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这个列.

如上图那一坨字符就是真正的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;
/

然后我们试下执行,  参数就选上面T_rowid表中, a=4那行数据啦, rowid= 'AAASOeAAEAAAADFAAB'

其中Object#就是 表T_rowid的object_id啦:

而Relative_info = 4是指这个rowid在第4号数据文件中

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

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

Oracle中的Rowid相关推荐

  1. oracle中rowid列,Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...

  2. oracle rowID切片,Oracle中的rowid

    ROWID是ORACLE中的一个重要的概念.用于定位数据库中一条记录的一个相对唯一地址值.通常情况下,该值在该行数据插入到数据库表时即被确定且唯一.ROWID它是一个伪列,它并不实际存在于表中.它是O ...

  3. ORACLE中的rowid用法

    rowid概述 rowid是一个用来唯一标记表中行的伪列.它是物理表中行数据的内部地址,包含两个地址,其一为指向数据表中包含该行的块所存放数据文件的地址,另一个是可以直接定位到数据行自身的这一行在数据 ...

  4. Oracle中使用rowid 进行去重

    伪列 Oracle 中伪列就像一个表列(表中的列),但是它并没有存储在表中,伪列可以从表中查询,但不能插入.更新和删除它们的值,在Oracle中我们常见的伪列有两个分别为rownum 和 rowid, ...

  5. oracle中中rowid,oracle中的Rowid和Urowid

    Oracle使用rowid数据类型存储行地址,rowid可以分成两种,分别适于不同的对像 Physical rowids:存储ordinary table,clustered table,table ...

  6. oracle获取rowid,Oracle中的ROWID实现

    一直以来,Oracle的发展是如火如荼,依然非常成熟,无论是行业的人员和资料的丰富程度.对于数据库的体系结构的内容,下面这张图我估计很多DBA都快看吐了,每次一提起体系结构,总是会看到这张图. 而看着 ...

  7. PostgreSQL实现oracle中rowid

    oracle中可以通过rowid定位到一条数据.索引扫描就是先根据查询条件的到对应数据的rowid,然后通过rowid得到数据,也可以直接使用rowid来查询数据,比如select * from tb ...

  8. Oracle中的rownum和rowid

    --注意:rownum和rowid只有Oracle有,其它数据库是不支持的 select * from scott.dept; --查询的结果称为'结果集' --rownum 伪列 '结果集'中产生的 ...

  9. oracle中 rownum与rowid的理

    一. Oracle分页查询 我们先看学习一下oracle分页查询的语法示例,然后在具体学习用rownum的原理. /*从第1条开始,每次选N个,从第1+M个开始每次选N个*/ /**/ select  ...

最新文章

  1. ERDAS软件应用(三)遥感图像的拼接
  2. Java集合类中绝对占有一席之地的List,涨薪7K!
  3. 中希尔排序例题代码_【数据结构与算法】这或许是东半球分析十大排序算法最好的一篇文章...
  4. 2018第一场多校 -补题
  5. 实现树状图_举个栗子!Tableau 技巧(132):用参数操作实现数据下钻
  6. k8s创建pod加入容器_K8S容器编排之POD健康检测(2)
  7. linux 增加maven内存,Ubuntu Linux系统下Apache Maven的安装和配置
  8. jsp table 中多出行数据_数据分析 | 如何基于高斯曲线拟合15分钟生活圈距离衰减规律...
  9. cpu爆了怎么排查和处理_CPU飙高,系统性能问题如何排查?
  10. SwitchHost无法切换环境
  11. PHP: ThinkPHP获取客户端IP地址
  12. Arduino IDE+_Attiny13/85实践(三) Lilypad Attiny85编程
  13. 判断布尔值的一些规则
  14. 提高软件开发工作效率的几种方法
  15. JZOJ4991. Skyfall
  16. [落选]狗熊会人才计划第6期选拔作业
  17. 调用百度地图API实现动态走航路线图
  18. 用php调用接口api
  19. 清理yarn、npm缓存包
  20. 2020年设计大事件盘点

热门文章

  1. buu Unencode
  2. 关于解决:ModuleNotFoundError: No module named ‘XXX‘的报错问题
  3. 【django】关联查询
  4. Linux网络配置与命令
  5. [architecture]-spin_unlock中是怎样让cpu退出standby模式的?
  6. 一次ctf中代码审计分析
  7. Mysql学习笔记之常用数据类型
  8. 4、图书类别添加功能
  9. 1.16 字符串的加密解密
  10. post基础-百度翻译接口测试