[20191012]組成rowid.txt
--//昨天做了拆分rowid的測驗,鏈接http://blog.itpub.net/267265/viewspace-2659613/=>[20191011]拆分rowid 2.txt
--//今天測驗通過 data_object_id , file ,; block , row 組成rowid的腳本.
--//Rowid 格式為:OOOOOOFFFBBBBBBRRR, data_object_id占6個字符,file占3個字符,block占6個字符,row占3個字符,當然如果存在在
--//存盤中占用10個位元組(32bit data_object_id +10 bit rfile# +22bit block + row 16bit),
--//其中,O是物件ID,F是檔案ID,B是塊ID,R是行ID,
--//當然在普通索引中僅僅占6位元組(注沒有32bit data_object_id少4個位元組,因為全部data_object_id都是一樣的),
--//磁區表的全域索引中占10位元組,
1.簡單說明:
Rowid采用64位進制編碼,編碼如下:
A-Z <==> 0 - 25 (26)
a-z <==> 26 - 51 (26)
0-9 <==> 52 - 61 (10)
+/ <==> 62 - 63 (2)
--//組成rowid,在oracle下通過執行:
SYS@test> select dbms_rowid.rowid_create(1,28035,11,195,62) from dual;
DBMS_ROWID.ROWID_C
------------------
AAAG2DAALAAAADDAA+
--//第一個引數1指建立extended ROWID.
2.測驗:
$ ./crrowid.sh 28035,11,195,62
rowid = AAAG2DAALAAAADDAA+
--//完成能與前面測驗對上.
3.腳本如下:
$ cat crrowid.sh
#! /bin/bash
# data_object_id , file ,; block , row --> rowid
odebug=${ODEBUG:-0}
O_BASE64=($( echo {A..Z} {a..z} {0..9} + / ))
if [ $odebug -eq 1 ] ; then
echo "ORACLE_BASE64 = ${O_BASE64[*]} "
fi
len=(6 3 6 3)
a=0
res=''
for i in $( echo "$*" | tr ',' ' ')
do
# echo $i
result=''
b=${len[$a]}
for j in $(echo "obase=64; $i" | bc| tr -d '\\\r\n')
do
result=${result}${O_BASE64[$(( 10#$j ))]}
done
res=${res}$(printf "%${b}s" $result | tr " " "A")
(( a++ ))
done
echo "rowid = $res"
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/163249.html
標籤:Linux
上一篇:sshd 啟動后 出現:Could not load host key: /etc/ssh/ssh_host_rsa_key
