Oracle SELECT查询中对象类型(...)写法的作用是什么?
解答
你的理解完全正确,MDSYS.VERTEX_TYPE(...) 就是调用对象类型的默认构造函数,生成对应的对象实例。
在这段查询的语境里,它的作用可以拆成两部分看:
- 首先
MDSYS.VERTEX_TYPE是Oracle Spatial空间组件自带的顶点对象类型,Oracle会为所有对象类型自动生成和类型同名的构造函数,入参顺序和类型定义的属性顺序一一对应,传入对应参数就能返回一个初始化好的顶点对象实例。 - 这段代码里传入构造函数的参数,就是把CTE里每行的零散x、y坐标值,补全VERTEX_TYPE要求的其他属性位(z值、测量值、维度标识等位置暂时传NULL),最后把当前分组的id作为顶点关联ID,把原本普通的数值行,转换成符合Spatial规范的顶点对象。
结合外层逻辑看整个聚合流程:
- 按id对原始坐标行分组
- 逐行调用构造函数把每行的x/y转成顶点对象
- 用
COLLECT聚合函数,把同组下的顶点对象按x、y排序后收集成集合 - 最后用
CAST把收集到的集合强转为MDSYS.VERTEX_SET_TYPE(Spatial定义的顶点集合嵌套表类型),最终实现按id把零散的坐标行聚合成可直接供空间计算函数使用的顶点集合。
你可以类比面向对象编程里的逻辑理解:
VERTEX_TYPE相当于定义好的「点」类,VERTEX_TYPE(x,y,...)就是实例化一个点对象存坐标值,COLLECT操作就是把同组的点对象攒成一个点列表。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

