|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
对于insert操作,只需要把event_type改成DELETE_ROWS_EVENT;对于delete操作,改成WRITE_ROWS_EVENT
关于rowid的一些内容
刘颖博
工夫:2004-6-12
mail:liuyingbo@126.com,请斧正
转载请说明出处及作者
本文会商的是关于oracle从8i入手下手引进object的观点后的rowid,即扩大(extended)的rowid:
1.rowid的先容
先对rowid有个感官熟悉:
SQL>selectROWIDfromBruce_testwhererownum<2;
ROWID
----------------------------
AAABnlAAFAAAAAPAAA
ROWID的格局以下:
数据工具编号文件编号块编号行编号
OOOOOOFFFBBBBBBRRR
我们能够看出,从下面的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的objectnumber,每一个数据库最多有4G个工具
10bit的filenumber,每一个工具最多有1022个文件(2个文件预留)
22bit的blocknumber,每一个文件最多有4M个BLOCK
16bit的rownumber,每一个BLOCK最多有64K个ROWS
2.rowid相干的有效的sql
最复杂的基于rowid的显现体例失掉的呼应的64位编码对应值的sql:
selectrowid,
substr(rowid,1,6)"OBJECT",
substr(rowid,7,3)"FILE",
substr(rowid,10,6)"BLOCK",
substr(rowid,16,3)"ROW"
fromTableName;
OWIDOBJECTFILEBLOCKROW
------------------------------------------------------
AAABc4AADAAAGLUAAAAAABc4AADAAAGLUAAA
AAABc4AADAAAGLUAABAAABc4AADAAAGLUAAB
AAABc4AADAAAGLUAACAAABc4AADAAAGLUAAC
AAABc4AADAAAGLUAADAAABc4AADAAAGLUAAD
AAABc4AADAAAGLUAAEAAABc4AADAAAGLUAAE
经由过程dbms_rowid这个包,能够间接的失掉详细的rowid包括的信息:
selectdbms_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)numfrombruce_twhererownum<5;
OBJECT_IDFILE_IDBLOCK_IDNUM
----------------------------------------
59443253000
59443253001
59443253002
59443253003
一些利用ROWID的函数
ROWIDTOCHAR(rowid):将ROWID转换成STRING
CHARTOROWID(rowid_string):将STRING转换成ROWID
别的,就是本人写的一些函数:(上面的函数是网友eygle供应)
createorreplacefunctionget_rowid
(l_rowidinvarchar2)
returnvarchar2
is
ls_my_rowidvarchar2(200);
rowid_typenumber;
object_numbernumber;
relative_fnonumber;
block_numbernumber;
row_numbernumber;
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_fnois:||to_char(relative_fno)||chr(10)||
Blocknumberis:||to_char(block_number)||chr(10)||
Rownumberis:||to_char(row_number);
returnls_my_rowid;
end;
/
使用下面的函数以下:
SQL>selectget_rowid(rowid),namefrombruce_t;
GET_ROWID(ROWID)NAME
----------------------------------------------------------------------------------------------------------------
Object#is:5944BruceLau
Relative_fnois:3
Blocknumberis:25300
Rownumberis:0
Object#is:5944MabelTang
Relative_fnois:3
Blocknumberis:25300
Rownumberis:1
CSV逻辑上由逗号分割数据的存储引擎 |
|