熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> JSP教程 >> 正文

關於擴展(extended)的rowid的一些內容

2013-11-15 11:46:19  來源: JSP教程 

      rowid的介紹
  先對rowid有個感官認識
  
  SQL> select ROWID from Bruce_test where rownum<;
  
  ROWID
  
  AAABnlAAFAAAAAPAAA
  
  ROWID的格式如下
  
  數據對象編號    文件編號    塊編號      行編號
  
  OOOOOO       FFF        BBBBBB RRR
  
  我們可以看出從上面的rowid可以得知
  
  AAABnl 是數據對象編號
  
  AAF是相關文件編號
  
  AAAAAP是塊編號
  
  AAA 是行編號
  
  怎麼依據這些編號得到具體的十進制的編碼值呢這是經常遇到的問題這裡需要明白rowid的是基於位編碼的個字符顯示(數據對象編號() +文件編號() +塊編號()+    行編號()=位)其中
  
  AZ <==> ()
  az <==> ()
   <==> ()
  +/ <==> ()
  
  共明白這個後就可以計算出進制的編碼值計算公式如下
  
  d * (b ^ p)
  
  其中b就是基數這裡就是p就是從右到左開始的位置數
  
  比如上面的例子
  
  文件號AAF具體的計算應該是:
  
  *(^)=
  
  *(^)=
  
  *(^)=
  
  文件號就是++=
  
  剛才提到的是rowid的顯示方式基於位編碼的個字符顯示其實rowid的存儲方式是 個字節即位存儲其中數據對象編號需要相關文件編號需要塊編號需要位行編號需要由此我們可以得出
  
  bit的object number每個數據庫最多有G個對象
  
  bit的file number每個對象最多有個文件(個文件預留)
  
  bit的block number每個文件最多有M個BLOCK
  
  bit的row number每個BLOCK最多有K個ROWS
  
      rowid相關的有用的sql
  最簡單的基於rowid的顯示方式得到的響應的位編碼對應值的sql
  
  select rowid
  
  substr(rowid) OBJECT
  
  substr(rowid) FILE
  
  substr(rowid) BLOCK
  
  substr(rowid) ROW
  
  from TableName;
  
  OWID       OBJECT    FILE  BLOCK    ROW
  
  
  
  AAABcAADAAAGLUAAA AAABc    AAD  AAAGLU    AAA
  
  AAABcAADAAAGLUAAB AAABc    AAD  AAAGLU    AAB
  
  AAABcAADAAAGLUAAC AAABc    AAD  AAAGLU    AAC
  
  AAABcAADAAAGLUAAD AAABc    AAD  AAAGLU    AAD
  
  AAABcAADAAAGLUAAE AAABc    AAD  AAAGLU    AAE
  
  通過dbms_rowid這個包可以直接的得到具體的rowid包含的信息
  
  select dbms_rowidrowid_object(rowid) object_id dbms_rowidrowid_relative_fno(rowid) file_id
  dbms_rowidrowid_block_number(rowid) block_id dbms_rowidrowid_row_number(rowid) num from bruce_t where rownum<;
  
  OBJECT_ID  FILE_ID  BLOCK_ID    NUM
  
  
  
                  
  
                  
  
                  
  
                  
  
  一些使用ROWID的函數
  ROWIDTOCHAR(rowid) 將ROWID轉換成STRING
  CHARTOROWID(rowid_string) 將STRING轉換成ROWID
  
   另外就是自己寫的一些函數(下面的函數是網友eygle提供)
  
  create or replace function get_rowid
  
  (l_rowid in varchar)
  
  return varchar
  
  is
  
  ls_my_rowid   varchar();     
  
  rowid_type   number;     
  
  object_number   number;     
  
  relative_fno   number;     
  
  block_number   number;     
  
  row_number   number; 
  
  begin
  
   dbms_rowidrowid_info(l_rowidrowid_typeobject_numberrelative_fno block_number row_number);     
  
   ls_my_rowid := Object# is   :||to_char(object_number)||chr()||
  
      Relative_fno is :||to_char(relative_fno)||chr()||
  
      Block number is :||to_char(block_number)||chr()||
  
      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   :                           BruceLau
  
  Relative_fno is :                               
  
  Block number is :                             
  
  Row number is  :                               
  
  Object# is   :                           MabelTang
  
  Relative_fno is :                               
  
  Block number is :                             
  
  Row number is  :
From:http://tw.wingwit.com/Article/program/Java/JSP/201311/19589.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.