Oracle rowid and urowid

来源:互联网 发布:游泳 肌肉 知乎 编辑:程序博客网 时间:2024/06/05 06:40

在Oracle内部,每个数据表都有一个伪列ROWID,用于存放被称为ROWID的二进制值。每个ROWID代表了一行数据的存储地址。物理ROWID能够标识普通数据表中的一行信息。其中ROWID类型只能存储物理内容,而UROWID(universal rowid)类型可以存储物理,逻辑或外来(non-Oracle)ROWID。

物理ROWID(PhysicalRowid)可以让我们快速的访问某些特定的行。只要行存在,它的物理ROWID就不会改变。高效稳定的物理ROWID在查询行集合、操作整个集合和更新子集是很有用的。例如,我们可以在UPDATE或DELETE语句的WHERE子句中比较UROWID变量和ROWID伪列来找出最近一次从游标中取出的行数据。

Rowid 使用6363的方式编码

 

OOOOOOFFFBBBBBBRRR这样的形式有四部分组成:

  1. "000000"代表数据对象号(data object number),如上例中的"AAAAqc",能够辨识数据库段。同一段中的模式对象,都有着相同的数据对象号。
  2. "FFF"代表文件号(file number),如上例中的"AAB",能辨识出包含行的数据文件。在数据库中,文件号是唯一的。
  3. "BBBBBB"代表块号(block number),如上例中的"AAADFN",能辨识出包含行的数据块。块号是与它们所在的数据文件相关,而不是表空间。所以,两个在同一表空间的行数据,如果它们处于不同的数据文件中,也可能有着相同的块号。
  4. "RRR"代表了行号(row number),如上例中的"AAH",可以辨识块中的行数据。

 

#根据rowid抽块对像编号

select dbms_rowid.rowid_object(ROWID)FROM tmp_test WHEREROWNUM <=1

 

#根据rowid抽取表空间相对文件号

selectdbms_rowid.rowid_relative_fno(ROWID)FROM tmp_test WHEREROWNUM <=1

 

#根据rowid抽取块号

select dbms_rowid.ROWID_BLOCK_NUMBER(ROWID)FROM tmp_test WHEREROWNUM <=1

 

#根据rowid抽取行号

select dbms_rowid.rowid_row_number(ROWID)FROM tmp_test WHEREROWNUM <=1

注意:这里取到的ROW_NUMBER是从0开始的


原创粉丝点击