Error with SDO_TUNE.EXTENT_OF on a table with more than one geometry.
683052Apr 7 2009 — edited Nov 19 2010Hello,
I'm using a GeoServer with Oracle Spatial database, and I run into some problems. GeoServer uses SDO_TUNE.EXTENT_OF to calculate the maximum extent of features you add. It works fine for all object with only one geometry, but fails for objects that has two geometry columns. The error is ORA-01422.
Is this a bug in Oracle, or am I doing something wrong? I know SDO_AGGR_MBR works fine, but I'd rather not use it, since if it is possible I would like to avoid changing the GeoServer functions.
Here is a small script I created to show this error:
1. Create two tables, object1 with one geometry and object2 with two geometry columns.
2. Create metadata (projected coordinate system).
3. Insert two rows, one in each table.
4. Create spacial indices.
5. Calculate extent, on object1 it will succeed, on object2 it will fail.
6. Clean.
CREATE TABLE object1
(
id NUMBER PRIMARY KEY,
geom1 SDO_GEOMETRY
);
CREATE TABLE object2
(
id NUMBER PRIMARY KEY,
geom1 SDO_GEOMETRY,
geom2 SDO_GEOMETRY
);
INSERT INTO user_sdo_geom_metadata (table_name, column_name, srid, diminfo)
VALUES
(
'OBJECT1',
'GEOM1',
2180,
SDO_DIM_ARRAY
(
SDO_DIM_ELEMENT('X', 400000, 700000, 0.05),
SDO_DIM_ELEMENT('Y', 300000, 600000, 0.05)
)
);
INSERT INTO user_sdo_geom_metadata (table_name, column_name, srid, diminfo)
VALUES
(
'OBJECT2',
'GEOM1',
2180,
SDO_DIM_ARRAY
(
SDO_DIM_ELEMENT('X', 400000, 700000, 0.05),
SDO_DIM_ELEMENT('Y', 300000, 600000, 0.05)
)
);
INSERT INTO user_sdo_geom_metadata (table_name, column_name, srid, diminfo)
VALUES
(
'OBJECT2',
'GEOM2',
2180,
SDO_DIM_ARRAY
(
SDO_DIM_ELEMENT('X', 400000, 700000, 0.05),
SDO_DIM_ELEMENT('Y', 300000, 600000, 0.05)
)
);
INSERT INTO object1 VALUES(1, SDO_GEOMETRY(2001, 2180, SDO_POINT_TYPE(450000, 350000, NULL), NULL, NULL));
INSERT INTO object2 VALUES(1, SDO_GEOMETRY(2001, 2180, SDO_POINT_TYPE(500000, 400000, NULL), NULL, NULL), SDO_GEOMETRY(2001, 2180, SDO_POINT_TYPE(550000, 450000, NULL), NULL, NULL));
CREATE INDEX object1_geom1_sidx ON object1(geom1) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
CREATE INDEX object2_geom1_sidx ON object2(geom1) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
CREATE INDEX object2_geom2_sidx ON object2(geom2) INDEXTYPE IS MDSYS.SPATIAL_INDEX;
SELECT SDO_TUNE.EXTENT_OF('OBJECT1', 'GEOM1') FROM DUAL;
SELECT SDO_TUNE.EXTENT_OF('OBJECT2', 'GEOM1') FROM DUAL;
SELECT SDO_TUNE.EXTENT_OF('OBJECT2', 'GEOM2') FROM DUAL;
DELETE FROM user_sdo_geom_metadata WHERE table_name IN ('OBJECT1', 'OBJECT2');
DROP INDEX object1_geom1_sidx;
DROP INDEX object2_geom1_sidx;
DROP INDEX object2_geom2_sidx;
DROP TABLE object1;
DROP TABLE object2;
Thanks for help.