All we need is an easy explanation of the problem, so here it is.
I have an Oracle 18c table that has an SDO_GEOMETRY column (lines):
create table a_sdo_geometry_tbl (line_id integer, shape mdsys.sdo_geometry);
insert into a_sdo_geometry_tbl (line_id, shape)
values (1, sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1),
sdo_ordinate_array (671539.6852734378,4863324.181436138, 671595.0500703361,4863343.166556185, 671614.013553706,4863350.343483042, 671622.2044153381,4863353.525396131)) );
insert into a_sdo_geometry_tbl (line_id, shape)
values (2, sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1),
sdo_ordinate_array (71534.5567096211,4863119.991809748, 671640.7384688659,4863157.132745253, 671684.8621150404,4863172.022995591)) );
insert into a_sdo_geometry_tbl (line_id, shape)
values (3, sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1),
sdo_ordinate_array (671622.2044153381,4863353.525396131, 671633.3267164109,4863357.846229106, 671904.0614077691,4863451.286166754)) );
insert into a_sdo_geometry_tbl (line_id, shape)
values (4, sdo_geometry (2002, null, null, sdo_elem_info_array (1,2,1),
sdo_ordinate_array (671684.8620521119,4863172.022995591, 671892.1496144319,4863244.141440067, 671951.2156571196,4863264.824310392, 671957.4471461186,4863266.847617676, 671966.8243856924,4863269.146632658)) )
select
line_id,
sdo_util.to_wktgeometry(shape) as well_known_text
from
a_sdo_geometry_tbl;
LINE_ID WELL_KNOWN_TEXT
--------------------------------------------------------------------------------
1 LINESTRING (671539.685273438 4863324.18143614, 671595.050070336 4863343.16655619, 671614.013553706 4863350.34348304, 671622.204415338 4863353.52539613)
2 LINESTRING (71534.5567096211 4863119.99180975, 671640.738468866 4863157.13274525, 671684.86211504 4863172.02299559)
3 LINESTRING (671622.204415338 4863353.52539613, 671633.326716411 4863357.84622911, 671904.061407769 4863451.28616675)
4 LINESTRING (671684.862052112 4863172.02299559, 671892.149614432 4863244.14144007, 671951.21565712 4863264.82431039, 671957.447146119 4863266.84761768, 671966.824385692 4863269.14663266)
4 rows selected.
For each line, I want to select each vertex as a separate row in a query/resultset.
How can I do this?
How to solve :
I know you bored from this bug, So we are here to help you! Take a deep breath and look at the explanation of your problem. We have many solutions to this problem, But we recommend you to use the first method because it is tested & true method that will 100% work for you.
Method 1
It looks like I can use the getvertices()
function and the table()
function
:
select
a.line_id,
--sdo_util.getvertices(a.shape),
b.id as vertex_id,
b.x, b.y
from
a_sdo_geometry_tbl a
cross join
table(sdo_util.getvertices(a.shape)) b
order by
a.line_id, b.id;
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
3 1 671622.204 4863353.53
3 2 671633.327 4863357.85
3 3 671904.061 4863451.29
4 1 671684.862 4863172.02
4 2 671892.150 4863244.14
4 3 671951.216 4863264.82
4 4 671957.447 4863266.85
4 5 671966.824 4863269.15
15 rows selected.
Note: Use and implement method 1 because this method fully tested our system.
Thank you 🙂
All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0