OBJECT_ID的重用(二)
上一篇 / 下一篇 2008-03-23 21:06:19 / 个人分类:ORACLE
Oracle对于过程会重用OBJECT_ID。这里的过程是指过程、函数、包和对象的总称。
这里通过TRACE来研究一下,Oracle内部是如何实现的。
OBJECT_ID的重用:http://yangtingkun.itpub.net/post/468/457962
前一篇文章通过一些测试的结果推测了Oracle关于OBJECT_ID重用的实现,这里通过TRACE功能来简单分析一下Oracle到底是如何工作的。
重启数据库后,首先删除P_TEST,然后对建立过程的操作进行TRACE:
SQL> ALTER SESSION SET EVENTS = '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
会话已更改。
SQL> CREATE PROCEDURE P_TEST AS
)y(Fw;K AP.zMB9s0 2 BEGINITPUB个人空间1rc2TDv)S|D(b5l
3 NULL;ITPUB个人空间b v"q(x/W`
4 END;
q:L.A&I"};n4wQ@a:~0 5 /
过程已创建。
SQL> ALTER SESSION SET EVENTS = '10046 TRACE NAME CONTEXT OFF';
会话已更改。
然后再次删除P_TEST过程,对建立P_TEST过程的操作进行TRACE:
SQL> DROP PROCEDURE P_TEST;
过程已删除。
SQL> ALTER SESSION SET EVENTS = '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
会话已更改。
SQL> CREATE PROCEDURE P_TEST ASITPUB个人空间EU?2XF(W7z
2 BEGINITPUB个人空间4o%}KYGE t(j[
3 NULL;ITPUB个人空间2E+F?-@|;L!A:F
4 END;
:w*D'v!@X+}
m0 5 /
过程已创建。
SQL> ALTER SESSION SET EVENTS = '10046 TRACE NAME CONTEXT OFF';
会话已更改。
最后跟踪删除过程的操作:
SQL> ALTER SESSION SET EVENTS = '10046 TRACE NAME CONTEXT FOREVER, LEVEL 12';
会话已更改。
SQL> DROP PROCEDURE P_TEST;
过程已删除。
SQL> ALTER SESSION SET EVENTS = '10046 TRACE NAME CONTEXT OFF';
会话已更改。
为了描述方便,将这三个TRACE操作对应的TRACE文件分别命名为TRACE1、TRACE2和TRACE3。TRACE1对应的创建过程由于是在刚重启数据库后,因此没有重用OBJECT_ID,重新分配了一个OBJECT_ID。TRACE2对应的创建过程,重用了以前存在的OBJECT_ID。而TRACE3记录了删除过程中,Oracle如何进行操作。
由于TRACE中的内容众多,而且绝大部分与当前的主题无关,这里只列出部分与OBJ$表有关的操作。
首先看TRACE1中如何处理:
BINDS #3:ITPUB个人空间^*q%jb[-D!_#h
kkscoacdITPUB个人空间}zqc!xe.A
Bind#0ITPUB个人空间(h6BJWw0U7M1Y[]
acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00ITPUB个人空间xCQ4H7o6j^
acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
;IoeFan:m0 kxsbbbfp=07edcf
value=61
zHv9e;REv0 Bind#1
*irp#mo/w2[+\0 acdty=01 mxl=32(06) mxlc=00 mal=00 scl=00 pre=00
fN\|j?wGn0 acflg=18 fl2=0001 frm=01 csi=852 siz=32 ff=0ITPUB个人空间2o3fz{;v0T^
kxsbbbfp=07edcf50 bln=32 avl=06 flg=05
f7T9S*y"DA0 value="P_TEST"ITPUB个人空间~J*sV*j
Bind#2
URJ(~L({*w0 acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00ITPUB个人空间w:o$H6K|!yX zu h,~"A
acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
!g4R9sW]'go*q0 kxsbbbfp=07edcf
N
Z2E&jwW7f0 value=1
"Fv9_3u1GE4Oxz Y0=====================ITPUB个人空间Nu&E"ZZ4tc[%Fx
PARSING IN CURSOR #3 len=198 dep=1 uid=0 ct=3 lid=0 tim=9453664822 hv=4125641360 ad='336db760'ITPUB个人空间0qH$a\j ICNQ:c){E9i
select obj#,type#,ctime,mtime,stime,status,dataobj#,flags,oid$, spare1, spare2 from obj$ where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null and linkname is null and subname is nullITPUB个人空间yO*p#n$y3C'j0Kgo,b
END OF STMT
ZslG|Rm2y'KeU0EXEC #3:c=0,e=166,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=9453664816
O*z"rB&|S0FETCH #3:c=0,e=31,p=0,cr=2,cu=0,mis=0,r=0,dep=1,og=4,tim=9453664902ITPUB个人空间:E[6j6j
B'Tn&y5x
BINDS #4:
djo
Tr3]0kkscoacd
Y6nj N fCK\X0 Bind#0ITPUB个人空间^A[d+dy
o+r-f
acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00ITPUB个人空间5p(vd{
|
acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
C0X2f
q1jC4GH5F0 kxsbbbfp=07edcf
value=1ITPUB个人空间#D%W+k5ke-]
Bind#1ITPUB个人空间%Y
C _qY0nE[
b
acdty=01 mxl=32(06) mxlc=00 mal=00 scl=00 pre=00ITPUB个人空间R
B|,rC"b q-Lt5d
acflg=18 fl2=0001 frm=01 csi=852 siz=32 ff=0
Z}p/r~m*Qz0 kxsbbbfp=07edcf50 bln=32 avl=06 flg=05ITPUB个人空间!Hr&PN6L
value="P_TEST"ITPUB个人空间-z!d(k?7{P%\.QH
Bind#2ITPUB个人空间]J:g
MW
acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00ITPUB个人空间5A*Iy"yP"F@5oR
acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
/m8Lk1e'g0p
W0 kxsbbbfp=07edcf
2z z5TI4]0 value=1ITPUB个人空间8O2c#Q#n)N7V
=====================
Kdohby!y0PARSING IN CURSOR #4 len=198 dep=1 uid=0 ct=3 lid=0 tim=9453665238 hv=4125641360 ad='336db760'
(A9Zxx4T4o0select obj#,type#,ctime,mtime,stime,status,dataobj#,flags,oid$, spare1, spare2 from obj$ where owner#=:1 and name=:2 and namespace=:3 and remoteowner is null and linkname is null and subname is null
/r(`3}*A0O;L0END OF STMTITPUB个人空间*l#xVngC{
EXEC #4:c=0,e=169,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=9453665233ITPUB个人空间9M)x.KaQty/Ln6Y
FETCH #4:c=0,e=28,p=0,cr=2,cu=0,mis=0,r=0,dep=1,og=4,tim=9453665318
Oracle分别在当前用户下和PUBLIC用户下查找同名的对象,都没有找到。
PARSING IN CURSOR #6 len=205 dep=1 uid=0 ct=2 lid=0 tim=9454380157 hv=3861105107 ad='27dc35dc'
]5{.wW A?z,B3x0insert into obj$(owner#,name,namespace,obj#,type#,ctime,mtime,stime,status,remoteowner,linkname,subname,dataobj#,flags,oid$,spare1,spare2)values(:1,:2,:3,:4,:5,:6,:7,:8,:9,:10,:11,:12,:13,:14,:15,:16, :17)
*OK!NDM y]"d%k0END OF STMTITPUB个人空间/L]7H(^Y @pq }f
PARSE #6:c=0,e=753,p=0,cr=0,cu=0,mis=1,r=0,dep=1,og=4,tim=9454380151
%XS
jWI,SE0BINDS #6:ITPUB个人空间?~RH(@}vt
kkscoacdITPUB个人空间"N!L1G?2jm$D#\)w
Bind#0
oo
\-A
b0 acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00ITPUB个人空间K1r
N^+b(P
dI3W
acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
?
W];p,A0 kxsbbbfp=07ecfbdc bln=22 avl=02 flg=05ITPUB个人空间Cl'i,|.c g6[2rL5w
value=61
U]
M1w1l_g)`{0 Bind#1
zhFg3f8m h+k0 acdty=01 mxl=32(06) mxlc=00 mal=00 scl=00 pre=00
w7C2A[(j4r#W0 acflg=18 fl2=0001 frm=01 csi=852 siz=32 ff=0
K$BBD0a0 kxsbbbfp=27dd1b36 bln=32 avl=06 flg=09
;KgW ]-_f0 value="P_TEST"ITPUB个人空间 E
d8oz&d5~O4f-x
Bind#2
#r4y4A"n\L3Ww&\0 acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
`(|B#C}0x0 acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
Ry,l9x\7DWL W0 kxsbbbfp=07ecfbb8 bln=24 avl=02 flg=05
Y#dK9V4Fk0 value=1ITPUB个人空间&u+u
Eg? pd
Bind#3ITPUB个人空间 bvt{$P3v o ov
acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
O BK7L&F9I N!TX8XCV0 acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
$yC:i;@#]!U0 kxsbbbfp=07ecfb94 bln=24 avl=04 flg=05ITPUB个人空间p#r7T U7Y ?IJdw
value=55506ITPUB个人空间W{*J;`Pa/jy
Bind#4ITPUB个人空间7\9C:xLi{
acdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00ITPUB个人空间 ? @S3aK2nf Pb
v-RaS
acflg=08 fl2=0001 frm=00 csi=00 siz=24 ff=0
,V0\c.D U&_s
r|!n:u0 kxsbbbfp=07ecfb70 bln=24 avl=02 flg=05ITPUB个人空间@0hO(\'Jn
value=7
&V g9SO-MC0 Bind#5