SDO_AGGR_UNION必须配合SDOAGGRTYPE使用,因后者封装几何列和容差值以处理拓扑异常;裸写会报ORA-00904或ORA-29902;正确用法为GROUP BY下传入SDOAGGRTYPE(geom,tol),且需补全元数据。

直接结论:SDO_AGGR_UNION 必须配合 SDOAGGRTYPE 使用,且不能裸写成 SDO_AGGR_UNION(shape) —— 这会报 ORA-00904 “invalid identifier” 或 ORA-29902(索引扫描失败)。
为什么 SDO_AGGR_UNION 一定要带 SDOAGGRTYPE 包装
Oracle Spatial 的聚合函数(如 SDO_AGGR_UNION、SDO_AGGR_CONVEXHULL)不接受原始 SDO_GEOMETRY 列作为参数,而是强制要求用 SDOAGGRTYPE 类型封装,因为该类型携带两个关键信息:
- 几何列本身(
geometry字段) - 容差值(
tolerance),用于控制拓扑容错与坐标简化精度
漏掉容差或类型包装,Oracle 就无法确定如何处理重叠边界、微小缝隙、自相交等常见空间异常,直接拒绝执行。
正确写法:分组 + SDOAGGRTYPE + 容差值设置
假设你有一张行政区划表 districts,含字段 province_code 和 geom(SDO_GEOMETRY 类型),想按省合并所有地市面:
SELECT province_code, SDO_AGGR_UNION(SDOAGGRTYPE(geom, 0.005)) AS merged_geom FROM districts GROUP BY province_code;
关键点:
-
0.005是容差,单位与 SRID 坐标系一致(如 WGS84 下≈0.5km);太大会吞掉细小地块,太小则性能暴跌甚至内存溢出 - 必须显式
GROUP BY,否则SDO_AGGR_UNION返回单行,失去分组意义 - 结果列
merged_geom仍是SDO_GEOMETRY,可直接插入新表或参与后续空间运算
大集合聚合时的性能陷阱与拆分策略
当某一分组内几何数量超过 50–100 个,SDO_AGGR_UNION 易出现响应延迟、ORA-29902(用户定义的聚合函数错误)或临时表空间耗尽。这不是 bug,是 Oracle 对单次聚合深度的隐式限制。
推荐做法是“两层聚合”:
- 第一层:用子查询按
ROWNUM或哈希分片,每组 ≤ 10 行,各自调用SDO_AGGR_UNION - 第二层:将第一层结果再
GROUP BY一次,做最终合并
示例(伪逻辑,实际需用 WITH 或物化中间表):
WITH grouped_10 AS (
SELECT
province_code,
CEIL(ROWNUM / 10.0) AS batch_id,
SDO_AGGR_UNION(SDOAGGRTYPE(geom, 0.005)) AS partial_geom
FROM districts
GROUP BY province_code, CEIL(ROWNUM / 10.0)
)
SELECT
province_code,
SDO_AGGR_UNION(SDOAGGRTYPE(partial_geom, 0.005)) AS final_geom
FROM grouped_10
GROUP BY province_code;
结果存入表时的类型与元数据注意事项
聚合结果不能存进普通 GEOMETRY 列(Oracle 不识别该类型),必须声明为 mdsys.sdo_geometry:
CREATE TABLE province_merged ( province_code VARCHAR2(10), geom mdsys.sdo_geometry );
插入后,**必须补全元数据**到 USER_SDO_GEOM_METADATA,否则后续建空间索引或调用 SDO_RELATE 会报 ORA-13203:
INSERT INTO USER_SDO_GEOM_METADATA
VALUES (
'province_merged', 'geom',
MDSYS.SDO_DIM_ARRAY(
MDSYS.SDO_DIM_ELEMENT('X', -180, 180, 0.005),
MDSYS.SDO_DIM_ELEMENT('Y', -90, 90, 0.005)
),
4326
);
没这步,连 CREATE INDEX ... INDEXTYPE IS MDSYS.SPATIAL_INDEX 都会失败。
真正容易被忽略的是容差值的一致性:它既影响聚合结果形状,也必须和后续所有空间操作(如 SDO_INTERSECTION、SDO_WITHIN_DISTANCE)使用的容差对齐,否则看似相接的边界会判定为分离。











