dbms_rowid 在实际中的使用
os: centos 7.4
db: oracle 12.1.0.2
dbms_rowid 的 package
测试表准备
SQL> create table tmp_t0(c0 varchar2(100),c1 varchar2(100));
Table created.
SQL> insert into tmp_t0 select '1','11' from dual;
1 row created.
SQL> insert into tmp_t0 select '2','22' from dual;
1 row created.
SQL> set lines 500;
set pages 500;
SQL> col row_id format a30;
col c0 format a10;
col c1 format a10;
col objid format 9999999;
col rel_fno format 9999999;
col blockno format 9999999;
col rownumb format 9999999;
SQL> SELECT rowid as row_id,a.c0,a.c1,
dbms_rowid.rowid_object(rowid) objid,
dbms_rowid.rowid_relative_fno(rowid) rel_fno,
dbms_rowid.rowid_block_number(rowid) blockno,
dbms_rowid.rowid_row_number(rowid) rownumb
FROM tmp_t0 a;
ROW_ID C0 C1 OBJID REL_FNO BLOCKNO ROWNUMB
------------------------------ ---------- ---------- -------- -------- -------- --------
AAAWd8AABAAAYD5AAA 1 11 92028 1 98553 0
AAAWd8AABAAAYD5AAB 2 22 92028 1 98553 1
查找 object
SQL> col owner format a10;
col object_name format a30;
col object_id format 9999999999;
col data_object_id format 9999999999;
SQL> select do.owner,do.object_name,do.object_id,do.data_object_id
from dba_objects do
where 1=1
and do.object_name='TMP_T0'
;
OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID
---------- ------------------------------ ----------- --------------
SYS TMP_T0 92028 92028
查找 relative_fno
SQL> col file_name format a50;
col file_id format 99999;
SQL> select file_name,file_id
from dba_data_files
where 1=1
and file_id=1
;
FILE_NAME FILE_ID
-------------------------------------------------- -------
+DG_DATA/ORCL0/DATAFILE/system.281.998416799 1
查找 block_number
select *
from dba_extents de
where 1=1
and de.segment_name='TMP_T0'
and file_id=1
and 98553 between de.block_id
and de.block_id + de.blocks - 1
;
查找 rownumb
在 block 的行号,这个看 ROWID 最后三位
其实 ROWID 的组成都包含了这些信息,有空分析下 ROWID 的组成.
参考:
https://docs.oracle.com/database/121/ARPLS/d_rowid.htm#ARPLS053