甲骨文 18c:
在相关文章中,我演示了如何使用GetVertices()函数和Table()函数来提取 SDO_GEOMETRY 线的顶点:
select
a.line_id, b.id as vertex_id, b.x, b.y
from
a_sdo_geometry_tbl a,
table(sdo_util.getvertices(a.shape)) b --<<--Here
LINE_ID VERTEX_ID X Y
---------- ---------- ---------- ----------
1 1 671539.685 4863324.18
1 2 671595.050 4863343.17
1 3 671614.014 4863350.34
1 4 671622.204 4863353.53
2 1 71534.5567 4863119.99
2 2 671640.738 4863157.13
2 3 671684.862 4863172.02
作为学习练习,我想使用 PL/SQL创建自己的 GetVertices() 函数版本。
我对使用哪种机制持开放态度;以下任何一项都可以:
- 基本 SQL
- 模型子句
- 自定义函数
关键是,我想学习如何提取顶点并将它们放入查询中的嵌套表列中,就像 GetVertices() 函数一样。
此函数返回一个 MDSYS.VERTEX_SET_TYPE 对象,它由一个 MDSYS.VERTEX_TYPE 对象表组成。Oracle Spatial and Graph 将类型 VERTEX_SET_TYPE 定义为:
CREATE TYPE vertex_set_type as TABLE OF vertex_type;
Oracle Spatial and Graph 将对象类型 VERTEX_TYPE 定义为:
CREATE TYPE vertex_type AS OBJECT (x NUMBER, y NUMBER, z NUMBER, w NUMBER, v5 NUMBER, v6 NUMBER, v7 NUMBER, v8 NUMBER, v9 NUMBER, v10 NUMBER, v11 NUMBER, id NUMBER);
注意:VERTEX_SET_TYPE 和 VERTEX_TYPE 类型仅供 Oracle 使用。不要在您创建的列定义或函数中使用这些类型。
问题:
有没有办法将 SDO_GEOMETRY 行的顶点提取到查询中的嵌套表列中——而不使用 GetVertices() 函数?输出将是查询结果集,而不是静态表。
提示:
以下功能可能有用:
PointN:返回一个点,它是顶点集合中的第 n 个顶点
GetNumVertices:返回输入几何中的顶点数。
似乎唯一的方法是创建自定义类型和自定义函数:
测试数据:
使用自定义函数: