将 UDT 子类型转换为超类型

问题描述 投票:0回答:1

我在 Oracle 18c 中使用名为 ST_GEOMETRY 的用户定义类型 (UDT):

我有一个生成 ST_GEOMETRY 超类型的查询:

select
    sde.st_geometry('LINESTRING(1 2,3 4,5 6)', 26917) as geom
from
    dual
    
[SDE.ST_GEOMETRY]

我想选择该几何体的特定顶点 - ST_GEOMETRY 线的 起点

select
    sde.st_startpoint(sde.st_geometry('LINESTRING(1 2,3 4,5 6)', 26917)) as startpoint
from
    dual
    
[SDE.ST_POINT]

请注意,输出是 ST_POINT 子类型,而不是 ST_GEOMETRY 超类型。

起点查询在 SQL 客户端中运行没有错误。但是,我想在 GIS 软件中使用查询,该软件有一个限制,即不能使用 ST_POINT 子类型。它只能使用 ST_GEOMETRY 超类型。

软件供应商将此问题归咎于 Oracle: 错误:无法在 ArcGIS 中定义查询图层,其中数据源在 Oracle 中使用 st_geometry 子类型。软件供应商建议采用以下解决方法(尽管他们没有说如何做到这一点):

从子类型转换几何属性字段(例如, st_point) 到超类型 st_geometry。

所以,我想使用Oracle的TREAT()函数从ST_POINT子类型转换为ST_GEOMETRY超类型:

select
    treat(sde.st_startpoint(sde.st_geometry('LINESTRING(1 2,3 4,5 6)', 26917)) as sde.st_geometry) startpoint_geom
from
    dual

[SDE.ST_POINT]

该查询在 SQL 客户端中运行没有错误。但它似乎没有正确转换为 ST_GEOMETRY 超类型。输出仍然是 ST_POINT 子类型,这不是我想要的。 (它仍然导致 GIS 软件出现问题。)


如何使用 TREAT() 函数将 UDT 子类型转换为超类型?

我知道还有其他解决方法,例如从

subtype
转换为
text
supertype
。但这是丑陋且缓慢的。我更喜欢使用 TREAT() 函数来进行转换,因为我认为这会更干净/更快。


相关:将 MDSYS.ST_LINESTRING 子类型值转换为 MDSYS.ST_GEOMETRY 超类型

oracle oop type-conversion geospatial user-defined-types
1个回答
0
投票

在回复创建 NIL(零顶点)几何体时,我提到错误已更新。现在建议我们使用st_geometry构造函数从子类型转换为超类型。这似乎适用于将 [SDE.ST_POLYFROMTEXT] 转换为 [SDE.ST_GEOMETRY]。

© www.soinside.com 2019 - 2024. All rights reserved.