在oracle上创建空间索引

时间:2016-04-14 13:22:57

标签: sql oracle geospatial spatial-index

我有一个表'floating_options',我想在列'area_geo'上创建一个空间索引(这是一个sdo_geometry列,当我从floating_options中选择*时,有两行数据按预期显示)。 / p>

我使用了以下代码,但我收到以下错误。我会非常感谢任何帮助!谢谢!

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.

3 个答案:

答案 0 :(得分:6)

在为表格编制索引之前,您应该让它在空间上启用' 尝试检查它是否显示在空间元数据中:

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>);

请更改&lt; 占位符&gt;因此

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

答案 1 :(得分:1)

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

Oracle的“智能”人员的下一个问题是,他们的USER_SDO_GEOM_METADATA表不支持小写名称(至少在11g中)。

所以使用像这样的表定义

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

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

结论:

  • 仅使用大写名称(或不使用双引号)
  • Orcale家伙是笨蛋

答案 2 :(得分:0)

这是一个解决方案:

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;

应该可以。