解決Oracle建立空間索引報錯ORA-29855,ORA-13249,ORA-29400,ORA-01426
阿新 • • 發佈:2018-11-01
問題描述
公司這邊用了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;
特此奉上,希望大家碰到了少走彎路!不謝!