如题的错误一般都是源于空间索引或者是本身数据对象有误造成的。
SELECT /*b.gwm_fid, b.gwm_fno, b.gwm_vno, a.gwm_tileid tileid, b.districtid*/COUNT(1)
FROM gs_tile_p a, vi_building_p b
WHERE b.gwm_vno = 26127
AND b.deletetag = 0
AND b.gwm_status = 0
AND sdo_relate(a.gwm_geometry, b.gwm_geometry, 'MASK = ANYINTERACT') =
'TRUE'
导致这个问题的原因是:表中存在geometry对象为空的记录。
如何查出这个问题:采用数据二分法,逐步缩小数据范围,最终定位到出问题的数据
解决办法:删除geometry为空的记录。
--ORA-29903: error in executing ODCIIndexFetch() routine
SELECT b.gwm_fid, b.gwm_fno, b.gwm_vno, a.gwm_tileid tileid, b.districtid
FROM gs_tile_p a, vf_fibresegment_l b
WHERE b.gwm_vno = 25441
AND b.deletetag = 0
AND b.gwm_status = 0
AND sdo_relate(a.gwm_geometry, b.gwm_geometry, 'MASK = ANYINTERACT') =
'TRUE'
AND b.gwm_fid IN (52217527,52217529)
这几条数据有问题,但是查不出是什么问题
验证数据的有效性
SELECT c.gwm_fid,
c.name,
sdo_geom.validate_geometry_with_context(c.gwm_geometry, 0.005)
FROM vf_fibresegment_l c
WHERE c.gwm_fid IN (52217527, 52217529);
经分析,发现出现了13356 [Element <1>] [Coordinate <8>]这个错误,即ora-1356:有重复点值。
如果想对整个图层一起验证,可用VALIDATE_LAYER_WITH_CONTEXT函数
--删除重复点sdo_util.remove_duplicate_vertices
UPDATE f_fibresegment_l t
SET t.gwm_geometry =
(SELECT sdo_util.remove_duplicate_vertices(a.gwm_geometry, 0.005)
FROM f_fibresegment_l a
WHERE a.gwm_fid IN (52217527, 52217529)
AND a.gwm_fid = t.gwm_fid)
WHERE t.gwm_fid IN (52217527, 52217529);
再次验证都是有效的图形,但是仍然无法执行分析,问题依旧
再次对对其中一条数据进行分析,发现出错的位置在哪段,然后再找了一条之前已经分析过的再次进行分析发现也是提示这个错误。恍然大悟,应该是用于分析的gs_tile_p 这个基表的索引出问题了。
找到问题就好办了,对该表的空间索引进行重建
alter index rebuild index_name online;
重建后再次分析如上语句果然成功了。
一直没有怀疑到gs_tile_p表空间索引有问题,是因为其他分析了很多数据都没问题,没想到空间索引还会部分有问题。