The SDO_GEOM.VALIDATE_GEOMETRY_WITH_CONTEXT function fails for 3D Compound line strings geometries as discussed over here. This is illustrated by the following sample:
2d:
with t1 as ( select 1 id, SDO_GEOMETRY( 2002,NULL,NULL, SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 3,2,2), SDO_ORDINATE_ARRAY ( 10,10, 10,14,6,10,14,10)) geom from dual ) select id , CASE g.geom.st_isvalid() when 1 then 'valid' when 0 then 'invalid' END validness , sdo_geom.validate_geometry_with_context( theGeometry => g.geom, tolerance => 0.001) reason from t1 g;
produces:
ID VALIDNESS REASON 1 valid TRUE
While the same geometry in 3d is considered invalid:
with t1 as ( select 1 id, SDO_GEOMETRY( 3002,NULL,NULL, SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 4,2,2), SDO_ORDINATE_ARRAY( 10,10,0, 10,14,0, 6,10,0, 14,10,0)) geom from dual ) select id , CASE g.geom.st_isvalid() when 1 then 'valid' when 0 then 'invalid' END validness , sdo_geom.validate_geometry_with_context( theGeometry => g.geom, tolerance => 0.001) reason from t1 g;
ID VALIDNESS REASON 1 invalid 54530 Point:0,Edge:1,
A Quick workaround for this is to convert the geometry to 2d:
with t1 as ( select 1 id, SDO_GEOMETRY( 3002,NULL,NULL, SDO_ELEM_INFO_ARRAY(1,4,2, 1,2,1, 4,2,2), SDO_ORDINATE_ARRAY( 10,10,0, 10,14,0, 6,10,0, 14,10,0)) geom from dual ) select id , CASE SDO_CS.MAKE_2D( geom).st_isvalid() when 1 then 'valid' when 0 then 'invalid' END validness , sdo_geom.validate_geometry_with_context( theGeometry => SDO_CS.MAKE_2D( g.geom), tolerance => 0.001) reason from t1 g;
result:
ID VALIDNESS REASON 1 valid TRUE
hope this helps, Stephan