posts - 25, comments - 69, trackbacks - 0, articles - 2

          作者:劉穎博


          時(shí)間:2004-6-12
          mail:liuyingbo@126.com,請(qǐng)指正
          轉(zhuǎn)載請(qǐng)注明出處及作者

          本文討論的是關(guān)于oracle從8i開(kāi)始引進(jìn)object的概念后的rowid,即擴(kuò)展(extended)的rowid:

          1.?????? rowid的介紹

          先對(duì)rowid有個(gè)感官認(rèn)識(shí):

          SQL> select ROWID from Bruce_test where rownum<2;

          ROWID
          ------------------ ----------
          AAABnlAAFAAAAAPAAA
          ?
          ROWID的格式如下:

          數(shù)據(jù)對(duì)象編號(hào)??????? 文件編號(hào)??????? 塊編號(hào)?????????? 行編號(hào)
          OOOOOO???????????? FFF??????????????? BBBBBB? RRR

          我們可以看出,從上面的rowid可以得知:
          AAABnl 是數(shù)據(jù)對(duì)象編號(hào)
          AAF是相關(guān)文件編號(hào)
          AAAAAP是塊編號(hào)
          AAA 是行編號(hào)

          怎么依據(jù)這些編號(hào)得到具體的十進(jìn)制的編碼值呢,這是經(jīng)常遇到的問(wèn)題。這里需要明白rowid的是基于64位編碼的18個(gè)字符顯示(數(shù)據(jù)對(duì)象編號(hào)(6) +文件編號(hào)(3) +塊編號(hào)(6)+?????? 行編號(hào)(3)=18位),其中
          A-Z <==> 0 - 25 (26)
          a-z <==> 26 - 51 (26)
          0-9 <==> 52 - 61 (10)
          +/ <==> 62 - 63 (2)

          共64位,明白這個(gè)后,就可以計(jì)算出10進(jìn)制的編碼值,計(jì)算公式如下:
          d * (b ^ p)
          其中:b就是基數(shù),這里就是64,p就是從右到左,已0開(kāi)始的位置數(shù)
          比如:上面的例子
          文件號(hào)AAF,具體的計(jì)算應(yīng)該是:
          5*(64^0)=5;
          0*(64^1)=0;
          0*(64^2)=0;
          文件號(hào)就是0+0+5=5
          剛才提到的是rowid的顯示方式:基于64位編碼的18個(gè)字符顯示,其實(shí)rowid的存儲(chǔ)方式是:10 個(gè)字節(jié)即80位存儲(chǔ),其中數(shù)據(jù)對(duì)象編號(hào)需要32 位,相關(guān)文件編號(hào)需要10 位,塊編號(hào)需要22,位行編號(hào)需要16 位,由此,我們可以得出:
          32bit的object number,每個(gè)數(shù)據(jù)庫(kù)最多有4G個(gè)對(duì)象
          10bit的file number,每個(gè)對(duì)象最多有1022個(gè)文件(2個(gè)文件預(yù)留)
          22bit的block number,每個(gè)文件最多有4M個(gè)BLOCK
          16bit的row number,每個(gè)BLOCK最多有64K個(gè)ROWS

          2.?????? rowid相關(guān)的有用的sql

          最簡(jiǎn)單的基于rowid的顯示方式得到的響應(yīng)的64位編碼對(duì)應(yīng)值的sql:
          select rowid ,
          substr(rowid,1,6) "OBJECT",
          substr(rowid,7,3) "FILE",
          substr(rowid,10,6) "BLOCK",
          substr(rowid,16,3) "ROW"
          from TableName;

          OWID????????????? OBJECT?????? FILE?? BLOCK??????? ROW
          ------------------ ------------ ------ ------------ ------
          AAABc4AADAAAGLUAAA AAABc4?????? AAD??? AAAGLU?????? AAA
          AAABc4AADAAAGLUAAB AAABc4?????? AAD??? AAAGLU?????? AAB
          AAABc4AADAAAGLUAAC AAABc4?????? AAD??? AAAGLU?????? AAC
          AAABc4AADAAAGLUAAD AAABc4?????? AAD??? AAAGLU?????? AAD
          AAABc4AADAAAGLUAAE AAABc4?????? AAD??? AAAGLU?????? AAE

          通過(guò)dbms_rowid這個(gè)包,可以直接的得到具體的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<5;

          OBJECT_ID??? FILE_ID?? BLOCK_ID??????? NUM
          ---------- ---------- ---------- ----------
          ????? 5944????????? 3????? 25300????????? 0
          ????? 5944????????? 3????? 25300????????? 1
          ????? 5944????????? 3????? 25300????????? 2
          ????? 5944????????? 3????? 25300????????? 3

          一些使用ROWID的函數(shù)
          ROWIDTOCHAR(rowid) :將ROWID轉(zhuǎn)換成STRING
          CHARTOROWID('rowid_string') :將STRING轉(zhuǎn)換成ROWID

          另外,就是自己寫(xiě)的一些函數(shù):(下面的函數(shù)是網(wǎng)友eygle提供)

          create or replace function get_rowid

          (l_rowid in varchar2)
          return varchar2
          is
          ls_my_rowid???? varchar2(200);?????????
          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(10)||
          ??????? 'Relative_fno is :'||to_char(relative_fno)||chr(10)||
          ??????? 'Block number is :'||to_char(block_number)||chr(10)||
          ??????? 'Row number is?? :'||to_char(row_number);
          ?return ls_my_rowid ;
          end;?????????

          /

          應(yīng)用上面的函數(shù)如下:
          SQL> select get_rowid(rowid), name from bruce_t;
          GET_ROWID(ROWID)???????????????????????????????????????????????????????????????? NAME

          -------------------------------------------------------------------------------- --------------------------------
          Object# is????? :5944????????????????????????????????????????????????????? BruceLau
          Relative_fno is :3??????????????????????????????????????????????????????????????
          Block number is :25300??????????????????????????????????????????????????????????
          Row number is?? :0??????????????????????????????????????????????????????????????
          Object# is????? :5944???????????????????????????????????????????????????? MabelTang
          Relative_fno is :3??????????????????????????????????????????????????????????????
          Block number is :25300??????????????????????????????????????????????????????????
          Row number is?? :1???

          ?

          Feedback

          # re: 關(guān)于oracle rowid的一些內(nèi)容  回復(fù)  更多評(píng)論   

          2006-06-05 11:05 by whw
          學(xué)習(xí)中,謝謝!

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 新安县| 汽车| 厦门市| SHOW| 宁国市| 石林| 哈尔滨市| 大悟县| 左云县| 博罗县| 延安市| 岐山县| 科技| 女性| 宁河县| 安西县| 北碚区| 台中县| 手游| 通江县| 原阳县| 集贤县| 磴口县| 清涧县| 凤山县| 四子王旗| 德钦县| 靖宇县| 留坝县| 龙岩市| 工布江达县| 罗定市| 道真| 花垣县| 宿松县| 新邵县| 石屏县| 宜川县| 汽车| 阿克苏市| 绍兴市|