程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle中的rowid

Oracle中的rowid

編輯:Oracle教程

Oracle中的rowid


Oracle中的每個表都有一個rowid,它是一個18位字符組成字符串,例:AAANgBAABAAAO/KAAA.它包含的字符串由A-Z,a-z,0-9,+,/這些字符組成.是64進制.

其中A-Z對應0-25,a-z對應26-51,0-9對應52-61,+對應62,/對應63.

這個18位的字符串分成4段分別表示不同的意思(6,3,6,3),1-6位表示對象數據ID(段編號),7-9位代表數據文件編號,10-15位代表數據塊編號,16-18代表在數據塊中的行.

假設建立下面一個表:

create table tb(id int,name varchar2(10))

insert into tb values(1,'a')
insert into tb values(2,'b')

通過select rowid,id from tb得到:

AAANgBAABAAAO/KAAA 1
AAANgBAABAAAO/KAAB 2

以AAANgB AAB AAAO/K AAA 為例,

AAANgB為表tb的id,

通過select * from all_objects where object_name='TB' 看到 object_id為55297,

計算AAANgB的10進制的值為:select 13*64*64+32*64+1 from dual 得到的值也為55297.

AAB為數據文件的編號:1,代表dba_data_files的file_id,通過select * from dba_data_files可以看到對應的數據文件信息.

AAAO/K代表塊的編號:61386,通過 select 14*64*64 +63*64 + 10 from dual計算得到

行的編號是:0,上面兩行是鄰接的,僅僅行號不同.

通過下面的sql可以查看這個數據塊是不是加載到了數據緩沖區:select * from v$bh where block#=61386 and file#=1

知道了塊號之後,可以dump這個塊在內存(數據緩沖區)中的內容: alter system dump datafile 1 block 61386

知道了塊號之後,可以dump這個塊在數據文件中的內容:

alter system dump datafile 'D:\ORACLE\PRODUCT\10.2.0\ORADATA\ORCL\SYSTEM01.DBF' block 61386

(由於Oracle的寫數據到數據文件並不一定在commit後就完成,可以通過ALTER SYSTEM checkpoint強制將數據有數據緩沖區寫入數據文件)

然後在udump文件夾下的trace文件中可以看到dump的內容.

Oracle中的一個package dbms_rowid裡直接提供了函數來得到塊號,行號

dbms_rowid.rowid_object:對象編號
dbms_rowid.rowid_relative_fno:文件編號
dbms_rowid.rowid_block_number:塊號
dbms_rowid.rowid_row_number:行號

例:select rowid,id,dbms_rowid.rowid_block_number(rowid) from tb

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved