Oracle 18c中MDSYS.ST_LINESTRING转MDSYS.ST_GEOMETRY超类型方法
Oracle 18c MDSYS.ST_LINESTRING转ST_GEOMETRY超类型方法
本问题针对Oracle 18c的MDSYS.ST_GEOMETRY数据类型,请勿与Esri的SDE.ST_GEOMETRY数据类型混淆。
问题背景
执行如下查询时,返回结果为MDSYS.ST_LINESTRING子类型值:
with data as ( select st_geometry.from_wkt('Linestring(1 2, 3 4, 5 6)',26917) as shape from dual) select shape from data
返回结果:
[MDSYS.ST_LINESTRING]
由于使用的GIS软件仅支持识别MDSYS.ST_GEOMETRY超类型值,无法识别子类型,且软件侧限制无法调整,需要在SQL查询层面完成子类型到超类型的转换。
已尝试无效方案
直接使用TREAT()函数做类型转换未生效,返回结果仍为MDSYS.ST_LINESTRING子类型,测试代码如下:
with data as ( select st_geometry.from_wkt('Linestring(1 2, 3 4, 5 6)',26917) as shape from dual) select treat(shape as mdsys.st_geometry) from data
返回结果仍为:
[MDSYS.ST_LINESTRING]
TREAT()函数仅做编译期类型声明和运行时类型校验,不会修改对象本身的实际类型,因此无法满足需求。
可行实现方案
方案1:调用ST_GEOMETRY超类型构造函数重建对象
直接提取子类型对象的WKB二进制几何内容和空间参考ID,传入超类型构造函数生成原生ST_GEOMETRY实例,无几何信息丢失,兼容性最好:with data as ( select st_geometry.from_wkt('Linestring(1 2, 3 4, 5 6)',26917) as shape from dual) select mdsys.st_geometry(shape.wkbgeom(), shape.st_srid()) as shape from data方案2:使用Oracle Spatial内置标准构造函数
调用sdo_util.st_geometryfromwkb函数,传入WKB和SRID生成超类型对象,返回值固定为MDSYS.ST_GEOMETRY类型:with data as ( select st_geometry.from_wkt('Linestring(1 2, 3 4, 5 6)',26917) as shape from dual) select sdo_util.st_geometryfromwkb(shape.wkbgeom(), shape.st_srid()) as shape from data
注意:不可直接将ST_LINESTRING子类型对象作为参数传入超类型构造函数,会触发类型转换异常,必须先提取几何的存储内容和空间参考信息再传入。
内容的提问来源于stack exchange,提问作者User1974
相关产品推荐
相关产品推荐

