By using db<>fiddle, you agree to license everything you submit by Creative Commons CC0.
CREATE TYPE my_sdo_geom_type AS OBJECT(
shape SDO_GEOMETRY,
MEMBER FUNCTION GetOrdinates(
self IN my_sdo_geom_type,
idx IN NUMBER
) RETURN NUMBER
)
/
CREATE TYPE BODY my_sdo_geom_type AS
MEMBER FUNCTION GetOrdinates(
self IN my_sdo_geom_type,
idx IN NUMBER
) RETURN NUMBER
IS
BEGIN
IF idx BETWEEN 1 AND shape.sdo_ordinates.COUNT THEN
return shape.sdo_ordinates(idx);
ELSIF -idx BETWEEN 1 AND shape.sdo_ordinates.COUNT THEN
RETURN shape.sdo_ordinates(shape.sdo_ordinates.COUNT + 1 + idx);
ELSE
RETURN NULL;
END IF;
END;
END;
/
create table lines (my_sdo_geom_col my_sdo_geom_type);
insert into lines (my_sdo_geom_col)
values (my_sdo_geom_type(sdo_geometry('linestring(10 20, 30 40, 50 60)')));
1 rows affected
select (my_sdo_geom_col).GetOrdinates( 1) as first_ordinate,
(my_sdo_geom_col).GetOrdinates(-1) as last_ordinate
from lines
FIRST_ORDINATE | LAST_ORDINATE |
---|---|
10 | 60 |