<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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開始引進(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)常遇到的問題。這里需要明白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開始的位置數(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

    通過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

    另外,就是自己寫的一些函數(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)航:
     
    主站蜘蛛池模板: 日韩亚洲产在线观看| 大地资源在线观看免费高清| 亚洲电影免费在线观看| 3344永久在线观看视频免费首页| 亚洲国产日韩综合久久精品| 亚洲欧洲久久久精品| 亚洲日本VA中文字幕久久道具| 亚洲成av人片不卡无码久久| 日本高清高色视频免费| 在线亚洲午夜片AV大片| 国产一级a毛一级a看免费视频| 亚洲码在线中文在线观看| 精品熟女少妇av免费久久| 亚洲大尺度无码专区尤物| 999zyz**站免费毛片| 亚洲国产精品无码专区| 67194成是人免费无码| 99视频免费在线观看| 亚洲AV无码一区二区三区性色| 婷婷亚洲综合五月天小说| 免费A级毛片无码A| 亚洲免费网站在线观看| www在线观看免费视频| 无码国产亚洲日韩国精品视频一区二区三区| 亚洲伦理中文字幕| 亚洲精品成人无码中文毛片不卡| 成熟女人牲交片免费观看视频| 成人片黄网站色大片免费观看APP| 亚洲第一综合天堂另类专 | 大学生美女毛片免费视频| 亚洲成a人片在线观看天堂无码| 亚洲VA成无码人在线观看天堂| 国产无遮挡又黄又爽免费视频| 免费观看美女用震蛋喷水的视频| 99re6在线精品免费观看| 菠萝菠萝蜜在线免费视频| 亚洲一久久久久久久久| 亚洲伊人久久精品| 免费a级毛片在线观看| 女人被男人躁的女爽免费视频| 毛片免费全部播放无码|