关于rowid的小小研究
来源:互联网 发布:mac ssh 免密码登录 编辑:程序博客网 时间:2024/05/16 18:48
rowid由4个部分组成:
第一部分:1-6位,标识对象即表 dbms_rowid.rowid_object返回object_id
第二部分:7-9位,标识数据文件 dbms_rowid.rowid_relative_fno返回rfile_id
第三部分:10-15位,标识数据块 dbms_rowid.rowid_block_number返回block_id
第四部分:16-18位,标识行在块的位置 dbms_rowid.rowid_row_number返回,值从0开始
如果你知道了上述4个部分的值,可以通过ROWID_CREATE函数组合成一个rowid
select t.*,
dbms_rowid.rowid_create(
1,object_id,rfile_id,block_id,row_no) cre_rowid
from (
select id,
dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) rfile_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) row_no,
rowid rid
from a) t;
ID OBJECT_ID RFILE_ID BLOCK_ID ROW_NO RID CRE_ROWID
---------- ---------- ---------- ---------- ---------- ------------------ ------------------
2 53057 4 110653 0 AAAM9BAAEAAAbA9AAA AAAM9BAAEAAAbA9AAA
3 53057 4 110653 1 AAAM9BAAEAAAbA9AAB AAAM9BAAEAAAbA9AAB
我们可以发现,rowid是由上述4部分数字以64进制组成,其中0-25以A-Z表示,26-51以a-z表示,52-61以0-9表示,62对应+,63对应/
对此,我们可以自己写个函数来实现上述几个取id值的功能,将相应部分转换成10进制的数字即可
create or replace function convert64to10(str in varchar2)
return number
as
result number:=0;
tmp char(1);
begin
for i in 1..length(str) loop
tmp:=substr(str,i,1);
result:=result+power(64,(length(str)-i))*(ascii(tmp)-
case when tmp between 'A' and 'Z' then 65
when tmp between 'a' and 'z' then 71
when tmp between '0' and '9' then -4
when tmp = '+' then -19
when tmp = '/' then -16
else 1/0 end);
end loop;
return result;
exception
when others then
return 0;
end;
/
ok,用这个函数从rowid中取4个部分的值试试
select id,
convert64to10(substr(rowid,1,6)) object_id,
convert64to10(substr(rowid,7,3)) file_id,
convert64to10(substr(rowid,10,6)) block_id,
convert64to10(substr(rowid,16,3)) row_no,
rowid rid
from a;
ID OBJECT_ID FILE_ID BLOCK_ID ROW_NO RID
---------- ---------- ---------- ---------- ---------- ------------------
2 53057 4 110653 0 AAAM9BAAEAAAbA9AAA
3 53057 4 110653 1 AAAM9BAAEAAAbA9AAB
是否与用dbms_rowid包取得的一致?
- 关于rowid的小小研究
- 关于 Rowid
- 关于rowid
- 数组引用与数组的一些小小小小研究
- [tips]关于rowid的一些内容
- [tips]关于rowid的一些内容
- 转:关于oracle rowid 的含义。
- [tips]关于rowid的一些内容
- 关于RowId RowNum uRowId的区别
- 关于oracle rowid的一些内容
- 关于oracle rowid的一些内容
- 关于oracle rowid的一些内容
- 关于oracle rowid的一些内容
- 关于oracle rowid的一些内容
- 关于oracle rowid的一些内容
- 关于ROWID是否重复的问题
- 关于oracle rowid 自动排序的理解
- Java Unicode转义字符的小小研究
- VC开发GTK配置环境
- MM常用T-CODE
- 自动更改网络配置
- PP常用T-CODE
- REST区域关系分析方法
- 关于rowid的小小研究
- 注册表修改:写该值的新内容时出错解决方案
- qt 加图标资源方法
- oracle 方案和表空间
- 一个汉字=2个英文字符么?我肤浅的这么认为。- -
- 一流国企与外企的待遇比较
- 网页打印完整代码
- event 坐标
- JS 脚本动态给控件添加事件