如何用SQL查找Oracle中SDE.ST_GEOMETRY类型的异常形状行
定位ST_GEOMETRY异常行的SQL方法
针对Oracle 18c + ArcGIS 10.7.1地理数据库中,GCSM_HC_ANNO表执行全量ST_Intersects查询触发ORA-20002错误的问题,可以通过以下几种SQL/PLSQL方法定位异常SHAPE行:
方法一:直接筛选无效几何
优先使用SDE自带的几何验证函数,排查本身不符合规范的点几何:
SELECT OBJECTID, SHAPE FROM GCSM_HC_ANNO WHERE SDE.ST_IsValid(SHAPE) = 0;
ST_IsValid返回0代表几何存在格式问题(比如空几何、坐标非法、结构损坏等),这类行通常是空间查询报错的直接诱因。
方法二:PLSQL遍历捕获执行时错误
如果无效几何筛选未找到问题,可能是几何在相交计算时触发特定逻辑错误,用PLSQL遍历每行并捕获异常:
DECLARE v_target_shape SDE.ST_GEOMETRY; v_err_code NUMBER; v_err_msg VARCHAR2(2000); BEGIN -- 先获取目标边界多边形(替换为实际筛选条件) SELECT SHAPE INTO v_target_shape FROM BOUNDARY WHERE OBJECTID = <目标多边形ID>; FOR rec IN (SELECT OBJECTID, SHAPE FROM GCSM_HC_ANNO) LOOP BEGIN -- 模拟执行相交判断逻辑 IF SDE.ST_Intersects(rec.SHAPE, v_target_shape) = 1 THEN NULL; END IF; EXCEPTION WHEN OTHERS THEN v_err_code := SQLCODE; v_err_msg := SQLERRM; DBMS_OUTPUT.PUT_LINE('异常行OBJECTID: ' || rec.OBJECTID || ' | 错误: ' || v_err_code || ' - ' || v_err_msg); END; END LOOP; END; /
执行后在DBMS输出中可以看到触发错误的具体行ID及错误信息,注意替换<目标多边形ID>为BOUNDARY表中实际要关联的多边形ID。
方法三:分块查询缩小范围
如果不想编写PLSQL,可以通过分段查询逐步定位报错区间:
-- 先查询1-1000行,根据数据量调整区间大小 SELECT * FROM GCSM_HC_ANNO WHERE OBJECTID BETWEEN 1 AND 1000 AND SDE.ST_Intersects(SHAPE, (SELECT SHAPE FROM BOUNDARY WHERE OBJECTID = <目标多边形ID>)) = 1;
若该分段报错,则继续拆分区间(比如1-500、501-1000),直到定位到单个异常行。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

