如何通过SQL直接获取SDO_GEOMETRY校验错误码的完整描述
SDO_GEOMETRY校验结果错误码自动匹配方案
Oracle Spatial的几何校验函数返回的开头数字就是标准ORA错误编号,可直接通过数据库内置函数提取错误码、匹配官方错误描述,无需手动查阅文档。
实现逻辑
sdo_geom.validate_geometry_with_context返回值格式固定:几何有效时返回字符串TRUE;几何无效时返回[错误码] [错误位置信息]- 用正则提取返回值开头的数字段,即为ORA错误的编号
- Oracle内置
sqlerrm()函数可根据错误号返回数据库内置的官方错误描述,注意传入参数为错误号的负值(ORA错误在数据库内部以负数形式存储) - 提取错误码后的剩余文本为具体出错的元素、环的位置信息,可直接拼接保留
优化后的校验SQL
针对单条几何校验场景,优化后可直接返回完整错误描述的语句如下:
with validate_res as ( select sdo_geom.validate_geometry_with_context( sdo_geometry ('polygon ((676832.320 4857578.086, 665287.423 4857578.086, 665277.423 4878109.585, 676832.320 4878119.585, 676842.320 4857588.086))', 26917) , 0.005) as raw_validation from dual ) select raw_validation as 原始返回结果, case when raw_validation = 'TRUE' then '几何对象有效,无错误' else sqlerrm(-to_number(regexp_substr(raw_validation, '^\d+'))) || ' | 出错位置:' || regexp_replace(raw_validation, '^\d+\s*', '') end as 完整校验说明 from validate_res;
测试用例返回结果
针对提供的测试几何,上述语句返回的完整校验说明为:
ORA-13348: polygon boundary is not closed | 出错位置:[Element <1>] [Ring <1>]
批量校验适配
如果需要对空间表内的全量几何做校验,直接将固定几何对象替换为表内的SDO_GEOMETRY字段即可,示例:
select t.id, -- 原始校验结果 sdo_geom.validate_geometry_with_context(t.spatial_col, 0.005) as 原始返回结果, -- 带错误说明的校验结果 case when sdo_geom.validate_geometry_with_context(t.spatial_col, 0.005) = 'TRUE' then '几何对象有效,无错误' else sqlerrm(-to_number(regexp_substr(sdo_geom.validate_geometry_with_context(t.spatial_col, 0.005), '^\d+'))) || ' | 出错位置:' || regexp_replace(sdo_geom.validate_geometry_with_context(t.spatial_col, 0.005), '^\d+\s*', '') end as 完整校验说明 from your_spatial_table t;
补充说明
- 该方案返回的错误描述和Oracle官方文档完全一致,数据库版本升级、补丁更新时错误描述会自动同步,不需要手动维护错误码映射表
- 测试用例中报错的根因是多边形首尾坐标偏差超过了0.005的设置容差:多边形第一个点坐标为
676832.320 4857578.086,最后一个点坐标为676842.320 4857588.086,两点XY坐标均存在10单位偏差,将最后一个点坐标修改为和首点一致即可通过校验。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

