在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=0 或
http://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;
应该可以。
我有一个 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=0 或 http://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;
应该可以。