Oracle rowid
[email?protected] prod>select rowid from scott.emp; ROWID ------------------ AAASPXAAEAAAACVAAA AAASPXAAEAAAACVAAB AAASPXAAEAAAACVAAC AAASPXAAEAAAACVAAD AAASPXAAEAAAACVAAE? ROWID的格式如下: 数据对象编号 文件编号 块编号 行编号 我们可以看出,从上面的rowid可以得知: 怎么依据这些编号得到具体的十进制的编码值呢 这里需要明白rowid的是基于64位编码的18个字符显示(数据对象编号(6) +文件编号(3) +块编号(6)+ 行编号 (3)=18位),其中 共64位,明白这个后,就可以计算出10进制的编码值,计算公式如下: 对象号就是73728+960+23=74711 刚才提到的是rowid的显示方式:基于64位编码的18个字符显示,其实rowid的存储方式是:10 个字节即80位存储,其中数据对象编号需要32 位,相关文件编号需要10 位,块编号需要22,位行编号需要16 位,由此,我们可以得出: 2. rowid相关的有用的sql 通过dbms_rowid这个包,可以直接的得到具体的rowid包含的信息: [email?protected] prod>select dbms_rowid.rowid_object(rowid) object_id,dbms_rowid.rowid_relative_fno(rowid) file_id,2 dbms_rowid.rowid_block_number(rowid) block_id,dbms_rowid.rowid_row_number(rowid) num from scott.emp 3 where rownum<5; OBJECT_ID FILE_ID BLOCK_ID NUM ---------- ---------- ---------- ---------- 74711 4 149 0 74711 4 149 1 74711 4 149 2 74711 4 149 3? 一些使用ROWID的函数 如果没有dbms包的权限可以用下面的方法 select (case when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),‘xxx‘) between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,‘xxx‘)+4 when to_number(utl_raw.cast_to_raw(substr(rowid,‘xxx‘) between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,‘xxx‘)-65 when to_number(utl_raw.cast_to_raw(substr(rowid,‘xxx‘) between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,‘xxx‘) = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,‘xxx‘) = 47 then 63 end)*power(64,5)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,2,4)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,3,3)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,4,2)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,6,0) as object_cd,(case when to_number(utl_raw.cast_to_raw(substr(rowid,7,8,9,0) as file_no,10,11,12,13,14,15,0) as block_no,16,17,18,0) as row_no from scott.emp; (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |