能否通过其他Oracle表的查询结果填充SDO_ORDINATE_ARRAY?
问题根因
你的报错来自两处核心错误:
- 语法错误:
SDO_ORDINATE_ARRAY是集合构造函数,支持直接传入数值序列或转换后的集合,不能在函数后嵌套VALUES关键字加子查询的写法 - 操作逻辑错误:你已经将名称、坐标串存入了
GEOMTEST的现有行,使用INSERT语句只会新增空白行,无法给已有行的COORD_GEOM字段赋值,应当使用UPDATE语句执行更新操作。
解决方案
假设你COORDS字段存储的是逗号分隔的连续数值串(标准格式为经度,纬度,经度,纬度...,多边形首尾顶点坐标重合),可使用以下SQL实现坐标到SDO几何对象的转换:
UPDATE geomtest SET coord_geom = SDO_GEOMETRY( 2003, -- 二维多边形类型编码 4326, -- WGS84坐标系SRID NULL, SDO_ELEM_INFO_ARRAY(1,1003,1), -- 外多边形、顺时针顶点标识 CAST(MULTISET( SELECT TO_NUMBER(REGEXP_SUBSTR(coords, '[^,]+', 1, LEVEL)) FROM dual CONNECT BY REGEXP_SUBSTR(coords, '[^,]+', 1, LEVEL) IS NOT NULL ) AS SDO_ORDINATE_ARRAY) ) WHERE name = '英国威尔士卡迪根湾'; -- 去掉WHERE条件可批量更新表中所有行的坐标几何字段
注意事项
- 若坐标串分隔符不是逗号,将
REGEXP_SUBSTR中的[^,]+的逗号替换为实际使用的分隔符即可 - 若坐标串包含括号、空格等冗余字符,可先通过
REGEXP_REPLACE(coords, '[^0-9\.,-]', '')清理无效字符后再拆分,避免转换报错 - 转换完成后可通过Oracle Spatial内置函数校验几何有效性:
SELECT name, SDO_GEOM.VALIDATE_GEOMETRY(coord_geom, 0.005) AS valid_result FROM geomtest;
返回TRUE代表几何对象合法,返回错误编码代表存在对应几何格式问题。
内容的提问来源于stack exchange,提问作者SeanGaff
相关产品推荐
相关产品推荐

