软件为 :
软件:arcsde 9.2
数据库:oracle10.2.0.1
现象:
数据库恢复后,使用ArcCatalog创建任何一个FeatureClass都会报ORA-00955,对象已经被使用的错误,但是实际上ArcCatalog目录树中并没有该FeatureClass
现场:用户使用的是SDELOB进行的存储,并且只要使用SDELOB进行存储都会报错,但是使用ST_GEOMETRY进行存储是没有问题。
解决过程:
使用oracle的后台跟踪对操作进行跟踪
在跟踪文件中发现该错误的所执行的sql语句如下:
PARSING IN CURSOR #66 len=387 dep=0 uid=56 oct=1 lid=56 tim=566762959823 hv=3561322370 ad='2de49354'
CREATE TABLE SDE.F415 (fid INTEGER NOT NULL, numofpts INTEGER NOT NULL, entity SMALLINT NOT NULL, eminx FLOAT(64) NOT NULL, eminy FLOAT(64) NOT NULL, emaxx FLOAT(64) NOT NULL, emaxy FLOAT(64) NOT NULL, eminz FLOAT(64) NULL, emaxz FLOAT(64) NULL, min_measure FLOAT(64) NULL, max_measure FLOAT(64) NULL, area FLOAT(64) NOT NULL, len FLOAT(64) NOT NULL, points LONG RAW)PCTFREE 0 INITRANS 4
END OF STMT
PARSE #66:c=0,e=635,p=0,cr=0,cu=0,mis=1,r=0,dep=0,og=1,tim=566762959816
BINDS #66:
=====================
PARSING IN CURSOR #69 len=493 dep=1 uid=0 oct=3 lid=0 tim=566762960100 hv=2584065658 ad='342d4f64'
select t.ts#,t.file#,t.block#,nvl(t.bobj#,0),nvl(t.tab#,0),t.intcols,nvl(t.clucols,0),t.audit$,t.flags,t.pctfree$,t.pctused$,t.initrans,t.maxtrans,t.rowcnt,t.blkcnt,t.empcnt,t.avgspc,t.chncnt,t.avgrln,t.analyzetime,t.samplesize,t.cols,t.property,nvl(t.degree,1),nvl(t.instances,1),t.avgspc_flb,t.flbcnt,t.kernelcols,nvl(t.trigflag, 0),nvl(t.spare1,0),nvl(t.spare2,0),t.spare4,t.spare6,ts.cachedblk,ts.cachehit,ts.logicalread from tab$ t, tab_stats$ ts where t.obj#= :1 and t.obj# = ts.obj# (+)
END OF STMT
PARSE #69:c=0,e=40,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=566762960091
BINDS #69:
kkscoacd
Bind#0
oacdty=02 mxl=22(22) mxlc=00 mal=00 scl=00 pre=00
oacflg=08 fl2=0001 frm=00 csi=00 siz=24 off=0
kxsbbbfp=0a8e607c bln=22 avl=04 flg=05
value=52209
EXEC #69:c=0,e=148,p=0,cr=0,cu=0,mis=0,r=0,dep=1,og=4,tim=566762960494
FETCH #69:c=0,e=175,p=0,cr=5,cu=0,mis=0,r=1,dep=1,og=4,tim=566762960699
STAT #69 id=1 cnt=1 pid=0 pos=1 obj=0 op='NESTED LOOPS OUTER (cr=5 pr=0 pw=0 time=184 us)'
STAT #69 id=2 cnt=1 pid=1 pos=1 obj=4 op='TABLE ACCESS CLUSTER TAB$ (cr=4 pr=0 pw=0 time=85 us)'
STAT #69 id=3 cnt=1 pid=2 pos=1 obj=3 op='INDEX UNIQUE SCAN I_OBJ# (cr=2 pr=0 pw=0 time=32 us)'
STAT #69 id=4 cnt=0 pid=1 pos=2 obj=708 op='TABLE ACCESS BY INDEX ROWID TAB_STATS$ (cr=1 pr=0 pw=0 time=50 us)'
STAT #69 id=5 cnt=0 pid=4 pos=1 obj=709 op='INDEX UNIQUE SCAN I_TAB_STATS$_OBJ# (cr=1 pr=0 pw=0 time=22 us)'
EXEC #66:c=0,e=1401,p=0,cr=5,cu=0,mis=0,r=0,dep=0,og=1,tim=566762961286
ERROR #66 :err=955 tim=56624315
从最后一行可以看出是执行第66个游标的sql语句所出的错,也就是
CREATE TABLE SDE.F415 (fid INTEGER NOT NULL, numofpts INTEGER NOT NULL, entity SMALLINT NOT NULL, eminx FLOAT(64) NOT NULL, eminy FLOAT(64) NOT NULL, emaxx FLOAT(64) NOT NULL, emaxy FLOAT(64) NOT NULL, eminz FLOAT(64) NULL, emaxz FLOAT(64) NULL, min_measure FLOAT(64) NULL, max_measure FLOAT(64) NULL, area FLOAT(64) NOT NULL, len FLOAT(64) NOT NULL, points LONG RAW)PCTFREE 0 INITRANS 4
这条sql语句,在创建表F415的时候因为该表已经存在,实际上这个表的确是存在,是一个现有FeatureClass的Feature Table表,所以报错.
F415表为FeatureClass的Feature Table其中415为该图层的ID号,这个ID号是用sde.layer_id_generator序列生成的,在用户的数据库中这个序列的LAST_NUMBER属性为414,INCREMENT_BY的属性为1,
如果再创建一个新的FeatureClass,它就会创建F(414+1)也就是F415表,但是这个表已经存在,所以出错.
最终使用select sde.layer_id_generator.nextval from dual;将ID手动的增加到指定大小解决问题。
另外:
用ST_GEOMETRY存储没有问题的原因为:
ST_GEOMETRY存储是将Business Table和Feature Table放在一个表中,Feature Table原有的记录作为SHAPE字段存储在Business Table中,所以不存在分配LayerID的问题.
最终导致出现这个问题的原因 :
是用户备份或者恢复所导致,用户备份或者恢复的时候只备份了或者只恢复了表,包等对象,没有备份或者恢复sequence对象.