在oracle上创建空间索引

Creating a spatial index on oracle

我有一个 table 'floating_options',我想在列 'area_geo' 上创建一个空间索引(这是一个 sdo_geometry 列,有两行当我 select * 来自 floating_options).

时按预期出现的数据

我使用了以下代码,但收到以下错误。如果有任何帮助,我将不胜感激!谢谢!

CREATE INDEX area_idx ON floating_options(area_geo)
   INDEXTYPE IS MDSYS.SPATIAL_INDEX;


Error report -
SQL Error: ORA-29855: error occurred in the execution of ODCIINDEXCREATE routine
ORA-13203: failed to read USER_SDO_GEOM_METADATA view
ORA-13203: failed to read USER_SDO_GEOM_METADATA view
ORA-06512: at "MDSYS.SDO_INDEX_METHOD_10I", line 10
29855. 00000 -  "error occurred in the execution of ODCIINDEXCREATE routine"
*Cause:    Failed to successfully execute the ODCIIndexCreate routine.
*Action:   Check to see if the routine has been coded correctly.

在索引 table 之前,您应该拥有它 'spatially enabled'。
尝试检查它是否显示在空间元数据中:

SELECT * FROM USER_SDO_GEOM_METADATA
    WHERE TABLE_NAME = UPPER('floating_options')
      AND COLUMN_NAME = UPPER('area_geo');

如果没有结果 - 那么有几个选项可用。
一种肮脏的方式——直接插入数据

INSERT INTO USER_SDO_GEOM_METADATA
VALUES (UPPER('floating_options'),UPPER('area_geo'),
        mdsys.SDO_DIM_ARRAY(
             mdsys.SDO_DIM_ELEMENT('Easting', <lowest_x>, <highest_x>, <x_tolerance>),
             mdsys.SDO_DIM_ELEMENT('Northing', <lowest_y>, <highest_y>, <y_tolerance>)
        ), <SRID>);

请相应地更改 < 占位符 >

请同时查看 https://community.oracle.com/thread/836452?tstart=0http://gerardnico.com/wiki/oracle_spatial/metadata

还应考虑以下因素:Oracle 具有区分大小写的名称 see this post

Oracle 的 "intelligent" 家伙的下一个问题是,他们的 USER_SDO_GEOM_METADATA table 不支持小写名称(至少在 11g 中)。

所以对于 table 这样的定义

CREATE TABLE "cola_markets" (
  "mkt_id" NUMBER PRIMARY KEY,
  "name" VARCHAR2(32),
  "shape" SDO_GEOMETRY);

您无法创建空间索引。

插入元数据时

INSERT INTO USER_SDO_GEOM_METADATA 
  VALUES (
  'cola_markets',
  'shape',
  SDO_DIM_ARRAY(   -- 20X20 grid
    SDO_DIM_ELEMENT('X', 0, 20, 0.005),
    SDO_DIM_ELEMENT('Y', 0, 20, 0.005)
     ),
  NULL   -- SRID
);

名称被转换为大写。

如果您随后创建索引

CREATE INDEX cola_spatial_idx
   ON "cola_markets"("shape")
   INDEXTYPE IS MDSYS.SPATIAL_INDEX;

你会得到上面提到的错误

ORA-13203: failed to read USER_SDO_GEOM_METADATA view

因为它无法在元数据中找到小写名称 table。

结论:

  • 仅使用大写名称(或不使用双引号)
  • Orcale 的人都是笨蛋

这是一个解决方案:

INSERT INTO user_sdo_geom_metadata 
VALUES ('target_table', 'SHAPE', sdo_dim_array(sdo_dim_element('x',-180,180,.005),sdo_dim_element('y',-90,90,.005)), 4326);

create index new_index_table on target_table(SHAPE) indextype is mdsys.spatial_index;

应该可以。