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; (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |