rowid的介紹 先對rowid有個感官認識
SQL> select ROWID from Bruce_test where rownum<
;
ROWID
AAABnlAAFAAAAAPAAA
ROWID的格式如下
數據對象編號 文件編號 塊編號 行編號
OOOOOO FFF BBBBBB RRR
我們可以看出
從上面的rowid可以得知
AAABnl 是數據對象編號
AAF是相關文件編號
AAAAAP是塊編號
AAA 是行編號
怎麼依據這些編號得到具體的十進制的編碼值呢
這是經常遇到的問題
這裡需要明白rowid的是基於
位編碼的
個字符顯示(數據對象編號(
) +文件編號(
) +塊編號(
)+ 行編號(
)=
位)
其中
A
Z <==>
(
)
a
z <==>
(
)
<==>
(
)
+/ <==>
(
)
共
位
明白這個後
就可以計算出
進制的編碼值
計算公式如下
d * (b ^ p)
其中
b就是基數
這裡就是
p就是從右到左
已
開始的位置數
比如
上面的例子
文件號AAF
具體的計算應該是:
*(
^
)=
*(
^
)=
*(
^
)=
文件號就是
+
+
=
剛才提到的是rowid的顯示方式
基於
位編碼的
個字符顯示
其實rowid的存儲方式是
個字節即
位存儲
其中數據對象編號需要
位
相關文件編號需要
位
塊編號需要
位行編號需要
位
由此
我們可以得出
bit的object number
每個數據庫最多有
G個對象
bit的file number
每個對象最多有
個文件(
個文件預留)
bit的block number
每個文件最多有
M個BLOCK
bit的row number
每個BLOCK最多有
K個ROWS
rowid相關的有用的sql 最簡單的基於rowid的顯示方式得到的響應的
位編碼對應值的sql
select rowid
substr(rowid
)
OBJECT
substr(rowid
)
FILE
substr(rowid
)
BLOCK
substr(rowid
)
ROW
from TableName;
OWID OBJECT FILE BLOCK ROW
AAABc
AADAAAGLUAAA AAABc
AAD AAAGLU AAA
AAABc
AADAAAGLUAAB AAABc
AAD AAAGLU AAB
AAABc
AADAAAGLUAAC AAABc
AAD AAAGLU AAC
AAABc
AADAAAGLUAAD AAABc
AAD AAAGLU AAD
AAABc
AADAAAGLUAAE AAABc
AAD AAAGLU AAE
通過dbms_rowid這個包
可以直接的得到具體的rowid包含的信息
select dbms_rowid
rowid_object(rowid) object_id
dbms_rowid
rowid_relative_fno(rowid) file_id
dbms_rowid
rowid_block_number(rowid) block_id
dbms_rowid
rowid_row_number(rowid) num from bruce_t where rownum<
;
OBJECT_ID FILE_ID BLOCK_ID NUM
一些使用ROWID的函數
ROWIDTOCHAR(rowid)
將ROWID轉換成STRING
CHARTOROWID(
rowid_string
)
將STRING轉換成ROWID
另外
就是自己寫的一些函數
(下面的函數是網友eygle提供)
create or replace function get_rowid
(l_rowid in varchar
)
return varchar
is
ls_my_rowid varchar
(
);
rowid_type number;
object_number number;
relative_fno number;
block_number number;
row_number number;
begin
dbms_rowid
rowid_info(l_rowid
rowid_type
object_number
relative_fno
block_number
row_number);
ls_my_rowid :=
Object# is :
||to_char(object_number)||chr(
)||
Relative_fno is :
||to_char(relative_fno)||chr(
)||
Block number is :
||to_char(block_number)||chr(
)||
Row number is :
||to_char(row_number);
return ls_my_rowid ;
end;
/
應用上面的函數如下
SQL> select get_rowid(rowid)
name from bruce_t;
GET_ROWID(ROWID) NAME
Object# is :
BruceLau
Relative_fno is :
Block number is :
Row number is :
Object# is :
MabelTang
Relative_fno is :
Block number is :
Row number is :
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19589.html