SYS@ prod>select rowid from scott.emp;ROWID ------------------ AAASPXAAEAAAACVAAA AAASPXAAEAAAACVAAB AAASPXAAEAAAACVAAC AAASPXAAEAAAACVAAD AAASPXAAEAAAACVAAE?
ROWID的格式如下:
數據對象編號 文件編號 塊編號 行編號
AAASPX AAE AAAACV AAA
我們可以看出,從上面的rowid可以得知:
AAASPX?是數據對象編號 (data_object)
AAE?是數據文件編號 (datafile)
AAAACV?是塊編號 (block)
AAA 是行編號 (row)
怎么依據這些編號得到具體的十進制的編碼值呢
這里需要明白rowid的是基于64位編碼的18個字符顯示(數據對象編號(6) +文件編號(3) +塊編號(6)+ 行編號 (3)=18位),其中
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)
共64位,明白這個后,就可以計算出10進制的編碼值,計算公式如下:
d * (b ^ p)
其中:b就是基數,這里就是64,p就是從右到左,以0開始的位置數
比如:上面的例子
對象號AAASPX?,具體的計算應該是:
0*(64^5)=5;0*(64^4)=0;0*(64^3)=0;18*(64^2)=73728;15*(64^1)=960;23*(64^0)=23;
對象號就是73728+960+23=74711
剛才提到的是rowid的顯示方式:基于64位編碼的18個字符顯示,其實rowid的存儲方式是:10 個字節即80位存儲,其中數據對象編號需要32 位,相關文件編號需要10 位,塊編號需要22,位行編號需要16 位,由此,我們可以得出:
32bit的object number,每個數據庫最多有4G個對象
10bit的file number,每個對象最多有1022個文件(2個文件預留)
22bit的block number,每個文件最多有4M個BLOCK
16bit的row number,每個BLOCK最多有64K個ROWS
2. rowid相關的有用的sql
通過dbms_rowid這個包,可以直接的得到具體的rowid包含的信息:
SYS@ 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 174711 4 149 274711 4 149 3?
一些使用ROWID的函數
ROWIDTOCHAR(rowid) :將ROWID轉換成STRING
CHARTOROWID('rowid_string') :將STRING轉換成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,1,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,1,1)),'xxx') = 47 then 63 end)*power(64,5)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,2,1)),'xxx') = 47 then 63 end)*power(64,4)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,3,1)),'xxx') = 47 then 63 end)*power(64,3)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,4,1)),'xxx') = 47 then 63 end)*power(64,2)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,5,1)),'xxx') = 47 then 63 end)*power(64,1)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,6,1)),'xxx') = 47 then 63 end)*power(64,0) as object_cd, (case when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,7,1)),'xxx') = 47 then 63 end)*power(64,2)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,8,1)),'xxx') = 47 then 63 end)*power(64,1)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,9,1)),'xxx') = 47 then 63 end)*power(64,0) as file_no, (case when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,10,1)),'xxx') = 47 then 63 end)*power(64,5)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,11,1)),'xxx') = 47 then 63 end)*power(64,4)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,12,1)),'xxx') = 47 then 63 end)*power(64,3)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,13,1)),'xxx') = 47 then 63 end)*power(64,2)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,14,1)),'xxx') = 47 then 63 end)*power(64,1)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,15,1)),'xxx') = 47 then 63 end)*power(64,0) as block_no, (case when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,16,1)),'xxx') = 47 then 63 end)*power(64,2)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,17,1)),'xxx') = 47 then 63 end)*power(64,1)+ (case when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') between 48 and 58 then to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx')+4 when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') between 65 and 91 then to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') between 97 and 123 then to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx')-65 when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') = 43 then 62 when to_number(utl_raw.cast_to_raw(substr(rowid,18,1)),'xxx') = 47 then 63 end)*power(64,0) as row_no from scott.emp;
?