正德厚生,臻于至善

在Oracle中根据file_id和block_id查找rowid

在Oracle中根据file_idblock_id查找对应的rowid,需结合块的归属对象及行号信息,具体可通过以下步骤实现:


1. 确认块的归属对象

通过DBA_EXTENTS确定file_idblock_id所属的段(表/索引等):

SELECT owner, segment_name, segment_type, partition_name
FROM dba_extents
WHERE file_id = &file_id
AND &block_id BETWEEN block_id AND block_id + blocks -1;

关键点‌:

  • 该查询返回包含目标块的对象信息(如表名、所有者)。
  • 若未返回结果,可能是块未被分配或属于空闲空间。

2. 获取相对文件号(rfile#)

通过DBA_DATA_FILES将绝对文件号(file_id)转换为表空间内的相对文件号:

SELECT relative_fno
FROM dba_data_files
WHERE file_id = &file_id;

注意‌:rowid中的文件号为相对文件号(rfile#),而非绝对文件号。


3. 查询目标块的rowid

基于步骤1的查询结果,扫描目标表并筛选出对应块的所有行:

SELECT rowid 
FROM <owner>.<segment_name> -- 替换为实际对象名
WHERE DBMS_ROWID.ROWID_BLOCK_NUMBER(rowid) = &block_id
AND DBMS_ROWID.ROWID_RELATIVE_FNO(rowid) = &relative_fno;

说明‌:

  • 使用DBMS_ROWID包解析rowid的块编号和文件编号。
  • 若表较大,建议添加ROWNUM限制结果集以提高效率。

4. 直接构造rowid(需已知行号)

若已知行号(row_number),可通过DBMS_ROWID.ROWID_CREATE生成rowid

sqlCopy CodeSELECT DBMS_ROWID.ROWID_CREATE(
   1,                  -- rowid类型(1=扩展rowid)
   data_object_id,     -- 从dba_objects.data_object_id获取
   relative_fno,       -- 步骤2结果
   &block_id,
   &row_number
) AS rowid
FROM dual;

适用场景‌:已知数据对象ID及行号(如通过日志或索引结构推导)。


补充说明

  • 性能优化‌:若表过大,可结合CTAS或并行查询加速块内行扫描。
  • 权限要求‌:需具备SELECT权限访问DBA_EXTENTSDBA_DATA_FILES及目标表。
  • 异常处理‌:若块未分配给任何对象,可能是临时段或空闲块,需结合DBA_FREE_SPACE验证。

操作流程图

确认file_id和block_id → 查询DBA_EXTENTS获取对象 → 转换绝对文件号为相对文件号 → 扫描表获取rowid或构造rowid
赞(0) 打赏
未经允许不得转载:徐万新之路 » 在Oracle中根据file_id和block_id查找rowid

支持快讯、专题、百度收录推送、人机验证、多级分类筛选器,适用于垂直站点、科技博客、个人站,扁平化设计、简洁白色、超多功能配置、会员中心、直达链接、文章图片弹窗、自动缩略图等...

联系我们

觉得文章有用就打赏一下文章作者

非常感谢你的打赏,我们将继续提供更多优质内容,让我们一起创建更加美好的网络世界!

支付宝扫一扫

微信扫一扫

登录

找回密码

注册