爱心技术专栏专题

Oraclesrowid

摘录:Oracle基础 来源:Oracle基础 加入时间:2007年03月25日
摘要:
Oraclesrowid
Oracles rowid
select col_1, col_2, rowid from some_table

A rowid identifies a row in a table

Oraclesrowid

站点:爱心种子小博士 关键字:Oraclesrowid

   
Oracles rowid
select col_1, col_2, rowid from some_table

A rowid identifies a row in a table

A rowid is a pseudo column (like versions_xid), that uniquely identifies a row within a table, but not within a database. It is possible for two rows of two different tables stored in the

Using dbms_rowid

In order to find the datafile, block number and slot number, dbms_rowid can be used:
set serveroutput on size 1000000 format wrappedcreate table rowid_test (  id      number,  dummy1  varchar2(4000),  dummy2  varchar2(4000),  dummy3  varchar2(4000),  dummy4  varchar2(4000));begin  for i in 1 .. 400 loop    insert into rowid_test values(i,       lpad(1, i, 1),      lpad(2, i, 2),      lpad(3, i, 3),      lpad(4, i, 4));  end loop;    -- delete but every 20th record  delete from rowid_test where mod(id,20) <> 0;end;/declare  r          rowid;  i          number := 1;  v_filename dba_data_files.file_name%type;begin  for p in (    select      rowid     from       rowid_test    ) loop     select       file_name     into        v_filename     from        dba_data_files     where       file_id = dbms_rowid.rowid_relative_fno(p.rowid);     dbms_output.put_line(row no    :  || i         );     dbms_output.put_line(  file    :  || v_filename);     dbms_output.put_line(  block no:  || dbms_rowid.rowid_block_number(p.rowid));     dbms_output.put_line(  slot no :  || dbms_rowid.rowid_row_number(p.rowid));     dbms_output.put_line();    i := i+1;  end loop;end;/drop table rowid_test;
row no    : 1  file    : D:\ORACLE\DATABASES\ORA10\DATA.DBF  block no: 3890  slot no : 19row no    : 2  file    : D:\ORACLE\DATABASES\ORA10\DATA.DBF  block no: 3890  slot no : 39  [....]

Bigfile rowids

A bigfile tablespace can only have on datafile associated with it, therefor, the three bytes that identified the datafile can now additionally be used to address db blocks.

Changing rowids

Although a rowid uniquely identifies a row in a table, it might change its value if the underlying table is an index organized table or a partitioned table.
Also, rowids change if a table is exported and imported using EXP/IMP.
This implies that rowids should not be stored away for later re-use as the corresponding row then might either not exist or contain completely different data.

Misc

Getting the block number (within a segment from a rowid:
select dbms_rowid.rowid_block_number(rowid) from t where ....