将 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() 函数进行转换。
You can use the TREAT function to change the declared type of an
expression.
但是正如您在上面的查询中看到的,即使我使用了 TREAT() 函数,输出仍然是 ST_POINT 子类型,而不是 ST_GEOMETRY 超类型。
就其价值而言,User-defined Type 也会发生同样的事情。
如何将 Oracle 子类型转换为其超类型?
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)
我有一个查询使用 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() 函数进行转换。
You can use the TREAT function to change the declared type of an expression.
但是正如您在上面的查询中看到的,即使我使用了 TREAT() 函数,输出仍然是 ST_POINT 子类型,而不是 ST_GEOMETRY 超类型。
就其价值而言,User-defined Type 也会发生同样的事情。
如何将 Oracle 子类型转换为其超类型?
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)