如題的錯誤一般都是源於空間索引或者是本身數據對象有誤造成的。
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表空間索引有問題,是因為其他分析了很多數據都沒問題,沒想到空間索引還會部分有問題。