Skip to Main Content

Database Software

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

some mysteries along sdo_aggr_union

FxKuApr 24 2014 — edited Apr 25 2014

Hi *

i have some trouble using spatial aggregate functions in Oracle Spatial within PL/SQL. The purpose of the function is to grab all geometries of a 3D object, make them 2D and aggregate them to one 2D footprint. Strangly my function is working for the first time being executed (after compiling) but following attemps lead to the this error: ORA-30625: method dispatch on NULL SELF argument is disallowed

From what I've read it appears to be a null-pointer exception, but I cannot see where it might happen. Even when I leave out the nested calls of sdo_aggr_union the error still occurs. Do I have to instantiate the my sdo_geometry variable? Thx in advance for any help.

PS: I'm using Oracle 12c.

Here's the code:

CREATE FUNCTION get_2d_footprint(object_id NUMBER) RETURN SDO_GEOMETRY

IS

    footprint SDO_GEOMETRY;

BEGIN

    -- other method I tried, but gets very very slow with complex 3D objects

    /*EXECUTE IMMEDIATE 'SELECT sdo_aggr_set_union(CAST(COLLECT(sdo_cs.make_2d(g.geometry)) AS MDSYS.SDO_GEOMETRY_ARRAY),0.001) AS aggr_geom

          FROM geom g, feature f

          WHERE g.root_id = f.geom_id

          AND g.geometry IS NOT NULL

          AND sdo_geom.validate_geometry(sdo_cs.make_2d(g.geometry), 0.001) = ''TRUE''

          AND f.id = :1' INTO footprint USING object_id;*/

    EXECUTE IMMEDIATE 'SELECT SDO_AGGR_UNION(MDSYS.SDOAGGRTYPE(aggr_geom, 0.001)) FROM

                               (SELECT SDO_AGGR_UNION(MDSYS.SDOAGGRTYPE(aggr_geom, 0.001)) aggr_geom FROM

                                  (SELECT SDO_AGGR_UNION(MDSYS.SDOAGGRTYPE(aggr_geom, 0.001)) aggr_geom FROM

                                     (SELECT SDO_AGGR_UNION(MDSYS.SDOAGGRTYPE(sdo_cs.make_2d(g.geometry), 0.001)) AS aggr_geom

                                        FROM geometry g, feature f

                                           WHERE g.root_id = f.geometry_id

                                           AND g.geometry IS NOT NULL

                                           AND sdo_geom.validate_geometry(sdo_cs.make_2d(g.geometry), 0.001) = ''TRUE''

                                           AND f.id = :1

                                        GROUP BY mod(rownum, 1000)

                                      )

                                   GROUP BY mod(rownum, 100)

                                  )

                                GROUP BY mod(rownum, 10)

                               )' INTO footprint USING object_id;

   RETURN footprint;

    EXCEPTION

      WHEN OTHERS THEN

        dbms_output.put_line('An error occured: ' || SQLERRM);

        RETURN NULL;

  END;

Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on May 23 2014
Added on Apr 24 2014
4 comments
2,387 views