1. 程式人生 > >解決Oracle建立空間索引報錯ORA-29855,ORA-13249,ORA-29400,ORA-01426

解決Oracle建立空間索引報錯ORA-29855,ORA-13249,ORA-29400,ORA-01426

問題描述

公司這邊用了Oracle Spatial來儲存GIS資料資訊,今天在某表上建立空間索引時報了下面的錯:

此處舉例說明:

假如有表TEST,其中有一列SHAPE儲存維度資訊。

CREATE INDEX IDX_TEST_SHAPE ON TEST(SHAPE) INDEXTYPE IS MDSYS.SPATIAL_INDEX;

在百度根本找不到相關解決方案,後來翻牆到谷歌上查了幾圈發現都不是很匹配,最後在Oracle官方社群找到了解決方案:

https://community.oracle.com/thread/2435630

 

原因分析

就是說該表中儲存的維度資訊有部分是非法的,導致域索引無法建立成功。

 

解決問題

辦法就是利用Oracle的SDO_GEOM包中的VALIDATE_LAYER_WITH_CONTEXT方法來找出異常資料並刪除,然後重建域索引就好了!

SDO_GEOM包相關參考:

http://docs.oracle.com/cd/E11882_01/appdev.112/e11830/sdo_objgeom.htm#BGHIAAIF

 

具體操作步驟SQL:

--1.建立測試表,用於儲存分析結果資料
CREATE TABLE val_results (sdo_rowid ROWID, result varchar2(1000));
--2.執行分析過程
CALL SDO_GEOM.VALIDATE_LAYER_WITH_CONTEXT('TEST','SHAPE','VAL_RESULTS');
--3.找出異常資料
SQL> SELECT * from val_results where length(result) < 10;

SDO_ROWID                                                                       
------------------                                                              
RESULT                                                                          
------------------------                                                                
AAABXNAABAAAK+YAAC 13011 (這一列就是異常程式碼,前面拼上ORA-百度一下就能查出具體異常描述)

---此處我查出:
ORA-13011: value is out of range..
Cause: A specified dimension value is outside the range
defined for that dimension.

Action: Make sure that all values to be encoded are within
the defined dimension range.

--意思就是這條資料中儲存的維度值超出了範圍

--4.刪除前面建立失敗的索引(雖然建立時候報錯了,但字典裡已經有了該索引資訊只不過是FAILED狀態不可用)
drop index idx_test_shape force;

--5.刪除這條資料
delete from test where rowid='AAABXNAABAAAK+YAAC';
commit;

--6.再次建立索引
CREATE INDEX IDX_TEST_SHAPE ON TEST(SHAPE) INDEXTYPE IS MDSYS.SPATIAL_INDEX; 

 

 

特此奉上,希望大家碰到了少走彎路!不謝!