<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

    關于oracle rowid的一些內容

    Posted on 2006-04-02 18:29 壯士日志 閱讀(1049) 評論(1)  編輯  收藏

    作者:劉穎博


    時間:2004-6-12
    mail:liuyingbo@126.com,請指正
    轉載請注明出處及作者

    本文討論的是關于oracle從8i開始引進object的概念后的rowid,即擴展(extended)的rowid:

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

    先對rowid有個感官認識:

    SQL> select ROWID from Bruce_test where rownum<2;

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

    數據對象編號??????? 文件編號??????? 塊編號?????????? 行編號
    OOOOOO???????????? FFF??????????????? BBBBBB? RRR

    我們可以看出,從上面的rowid可以得知:
    AAABnl 是數據對象編號
    AAF是相關文件編號
    AAAAAP是塊編號
    AAA 是行編號

    怎么依據這些編號得到具體的十進制的編碼值呢,這是經常遇到的問題。這里需要明白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開始的位置數
    比如:上面的例子
    文件號AAF,具體的計算應該是:
    5*(64^0)=5;
    0*(64^1)=0;
    0*(64^2)=0;
    文件號就是0+0+5=5
    剛才提到的是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

    最簡單的基于rowid的顯示方式得到的響應的64位編碼對應值的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這個包,可以直接的得到具體的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的函數
    ROWIDTOCHAR(rowid) :將ROWID轉換成STRING
    CHARTOROWID('rowid_string') :將STRING轉換成ROWID

    另外,就是自己寫的一些函數:(下面的函數是網友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;?????????

    /

    應用上面的函數如下:
    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: 關于oracle rowid的一些內容  回復  更多評論   

    2006-06-05 11:05 by whw
    學習中,謝謝!

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    主站蜘蛛池模板: 日本免费一区二区久久人人澡| 亚洲youwu永久无码精品| 嫩草在线视频www免费看| www.91亚洲| 在线观看免费av网站| 国产成人无码免费视频97| 亚洲日本国产综合高清| 最新中文字幕免费视频| 国产AV无码专区亚洲Av| 成人影片一区免费观看| 久久精品国产亚洲av成人| 一级特黄aa毛片免费观看| 亚洲综合色丁香麻豆| 在线观看免费黄色网址| 亚洲春色在线视频| 亚洲国产精品免费在线观看| 亚洲国产精品专区| 永久黄网站色视频免费观看| 成人亚洲国产精品久久| 国产亚洲精品成人AA片新蒲金 | 亚洲精品高清国产一久久| 十八禁无码免费网站| 亚洲国产模特在线播放| 成年女人毛片免费观看97| 精品亚洲成A人在线观看青青| 亚洲美女高清一区二区三区| 一本色道久久88—综合亚洲精品| 午夜免费福利在线| 二级毛片免费观看全程| 日本久久久免费高清| 久久精品国产亚洲AV久| 国产公开免费人成视频| 日韩精品无码免费专区午夜| 亚洲一线产区二线产区精华| 四虎影院永久免费观看| 无码国产精品一区二区免费模式| 日韩亚洲国产高清免费视频| 亚洲综合区小说区激情区| 五月亭亭免费高清在线| 午夜肉伦伦影院久久精品免费看国产一区二区三区 | 国产精品成人亚洲|