Oracle Spatial has a function called SDO_UTIL.GETVERTICES:
This function returns an object of MDSYS.VERTEX_SET_TYPE, which consists of a table of objects of MDSYS.VERTEX_TYPE.
CREATE TYPE vertex_set_type as TABLE OF vertex_type;
The GetVertices() function is typically used in conjunction with the Table() function. The geometry table is cross-joined with table(getvertices(shape)) to propagate vertex rows for each geometry:
with cte as (
select sdo_geometry('linestring (10 20, 30 40)') shape from dual union all
select sdo_geometry('linestring (50 60, 70 80, 90 100)') shape from dual union all
select sdo_geometry('linestring (110 120, 130 140, 150 160, 170 180)') shape from dual)
select
v.*
from
cte, table(sdo_util.getvertices(shape)) v
X Y Z W V5 V6 V7 V8 V9 V10 V11 ID
----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
10 20 1
30 40 2
50 60 1
70 80 2
90 100 3
110 120 1
130 140 2
150 160 3
170 180 4
And the examples in the docs suggest using Table() as well.
But from a quick test, using the table() function doesn't seem to be necessary. If I remove the Table() function from the query, it produces the same result.
Question:
How is it possible that cross-joining with a table object propagates rows — without needing the Table() function?
The docs suggest that we should use the Table() function, so I wonder if that was correct in older versions of Oracle, but maybe something changed in newer versions?
Related: