将 Oracle 子类型视为超类型

Treat Oracle subtype as supertype

我有一个查询使用 Oracle 的 MDSYS.ST_GEOMETRY 类型 (link):

select
    mdsys.st_point(1, 2, 26917)
from 
    dual

Output:
[MDSYS.ST_POINT]

查询输出ST_POINTsub类型。

我想将 ST_POINT 子类型转换为 ST_GEOMETRY super 类型:

select
    treat(
        mdsys.st_point(1, 2, 26917)
    as st_geometry)
    .st_geometrytype() --optional; helps when running the query in DB<>FIDDLE or Oracle Live SQL, since those DBs don't output spatial types correctly.   
from 
    dual

Output:
ST_POINT

我本以为可以使用 TREAT() 函数进行转换。

TREAT()

You can use the TREAT function to change the declared type of an expression.

但是正如您在上面的查询中看到的,即使我使用了 TREAT() 函数,输出仍然是 ST_POINT 子类型,而不是 ST_GEOMETRY 超类型。

就其价值而言,User-defined Type 也会发生同样的事情。


如何将 Oracle 子类型转换为其超类型?

相关:2.3 Inheritance in SQL Object Types

st_geometry 使用 sdo_geometry 作为其存储。因此,您会假设 TREAT 会很高兴 return st_geometry,因为不需要更改存储空间。

select mdsys.st_point(1,2,26917).geom.get_wkt() as geom from dual;

可以直接转换,:

select Mdsys.st_geometry(mdsys.st_point(1, 2, 26917).geom) as geom from dual

以@Simon 的回答为基础,以下是 Simon 查询的结果:

查询 #1:

 select mdsys.st_point(1,2,26917).geom as geom from dual;
 --I removed .get_wkt().
 
 Result:
 [MDSYS.SDO_GEOMETRY]

查询 #2:

 select Mdsys.st_geometry(mdsys.st_point(1, 2, 26917).geom) as geom from dual
 
 Result:
 [MDSYS.ST_GEOMETRY]

所以我认为这意味着两个查询都有效。他们将 ST_POINT 子类型转换为 ST_GEOMETRY 超类型。


我使用 CTRL+F5 运行 SQL Developer 中的查询。如果我使用普通的 F5,我会得到不同的结果,因为 F5/SQLPLUS 会自动将结果转换为几何图形的文本表示。所以查询的结果应该是 POINT (1.0 2.0),这是误导性的。结果真的是[MDSYS.ST_GEOMETRY].


相关:Unsupported datatype in Live SQL: st_geometry(st_point(1, 2, 26917).geom)