2016-11-08 68 views
2

我試圖插入此http://pastebin.com/cKXnCqx7幾何成SDO_GEOMETRY場,具體如下:如何將巨型幾何插入SDO_GEOMETRY類型的字段?

declare 
str clob = http://pastebin.com/cKXnCqx7 
begin 
INSERT INTO TEMP_TEST_GEOMETRY VALUES (SDO_CS.TRANSFORM (SDO_GEOMETRY (str, 4674), 1000205)); 
end; 

,併產生以下錯誤:

enter image description here

+1

請將錯誤發佈爲文本而不是圖片。問題不在於調用'sdo_geometry'構造函數;這就是你如何設置CLOB值。你將不得不建立在32K塊。 (像第一個代碼[這裏](http://stackoverflow.com/a/17359646/266304);我相信有更好的例子)。但是那個字符串從哪裏來?例如,你可以從文件中讀取它嗎? –

+0

這是一個**字符串** –

+0

我可以看到它是一個字符串。這是一個長度超過32個字符的字符串,這意味着您不能直接將其分配給變量 - 在PL/SQL中,字符串字面量的最大長度爲32k。你沒有在你的代碼中輸入。你是從一個文件複製和粘貼嗎?如果這樣的文件可以放在某個地方,你可以用'utl_file'來讀取它?否則,您必須手動將字符串切分爲較小的塊,以創建完整的CLOB值。 –

回答

4

一個字符串的最大大小爲32K在PL/SQL中。你試圖分配一個98K +文字,這就是導致錯誤的原因(儘管它指的是4k,這似乎來自普通的SQL調用,而不是你展示的PL/SQL塊)。它沒有盡力從CLOB創建對象sdo_geometry

理想情況下,您可以從文件或其他一些呈現完整CLOB的機制中加載值。如果你必須把它作爲一個文字來對待,你必須手動將它分成塊;至少4此值,如果你讓他們大:

declare 
    str clob; 
begin 
    dbms_lob.createtemporary(str, false); 
    dbms_lob.append(str, 'POLYGON ((-47.674240062208945 -2.8066454423517624, -47.674313162 -2.8066509996, <...snip...>'); 
    dbms_lob.append(str, '47.6753521374 -2.8067875453, -47.6752566506 -2.8067787567, -47.6752552377 -2.8067785117, <...snip...>'); 
    dbms_lob.append(str, '-47.658134547 -2.8044846153, -47.6581360233 -2.8044849964, -47.6581811229 -2.8044926289, <...snip...>'); 
    dbms_lob.append(str, '-47.6717079633 -2.8057792966, -47.6717079859 -2.80577931, -47.6717083252 -2.8057795101, -47.6718125136 -2.8058408619, -47.6719547186 -2.8059291721, -47.6719573483 -2.8059307844, -47.6719575243 -2.8059308908, -47.6719601722 -2.8059324729, -47.6720975574 -2.8060134925, -47.6721015308 -2.8060157903, -47.6721017969 -2.8060159412, -47.6721058088 -2.806018171, -47.6721847946 -2.8060611947, -47.6721897923 -2.8060650985, -47.6722059263 -2.8060767675, -47.6722070291 -2.8060775047, -47.6722416572 -2.8060971165, -47.6722428566 -2.8060976832, -47.6722611616 -2.8061055189, -47.6722666301 -2.8061076243, -47.6722849174 -2.806116847, -47.6722862515 -2.8061174528, -47.6723066339 -2.8061257231, -47.6723316499 -2.8061347029, -47.6723426416 -2.8061383836, -47.6723433793 -2.8061386131, -47.672354519 -2.8061418177, -47.6723803034 -2.8061486384, -47.6725084039 -2.8061908942, -47.6725130545 -2.8061923817, -47.6725133654 -2.806192478, -47.6725180423 -2.806193881, -47.6728423039 -2.8062879629, -47.6728698649 -2.8062995965, -47.6728952856 -2.8063088527, -47.672897007 -2.8063093833, -47.672949984 -2.8063200428, -47.6729517767 -2.8063202193, -47.672966443 -2.8063209226, -47.6729679855 -2.8063213223, -47.6733393514 -2.8064196858, -47.6733738728 -2.8064264543, -47.6733761939 -2.8064267537, -47.6733804796 -2.8064270239, -47.6733890639 -2.806431641, -47.6734057692 -2.8064398944, -47.6734069006 -2.8064404055, -47.6734241363 -2.8064474849, -47.6736663052 -2.8065373005, -47.6736676833 -2.8065378073, -47.6736677752 -2.8065378409, -47.673669156 -2.8065383402, -47.6737754465 -2.8065764489, -47.673793217 -2.8065850801, -47.6737945765 -2.8065856723, -47.6738366895 -2.8066000123, -47.6738381279 -2.8066003728, -47.6738811819 -2.8066074503, -47.6739137725 -2.8066153813, -47.6739159177 -2.806615636, -47.6739318345 -2.8066165588, -47.673951326 -2.806622013, -47.6739530661 -2.8066223195, -47.6739793945 -2.8066256302, -47.6740948445 -2.8066344025, -47.674240062208945 -2.8066454423517624))'); 
    INSERT INTO TEMP_TEST_GEOMETRY 
    VALUES (SDO_CS.TRANSFORM (SDO_GEOMETRY (str, 4674), 1000205)); 
    dbms_lob.freetemporary(str); 
end; 
/

可以使塊更小,並有更多的追加,可能在某些方面更易於管理,但更多的工作來設置。儘管手動操作仍然很痛苦,但如果你不能以其他方式獲得價值,這可能是最後的手段。


如果字符串是從一個HTTP來叫你可以讀取數據塊的響應,並將其轉換成CLOB當您閱讀它在幾乎相同的方式,使用dbms_lob.append。具體如何取決於您當前獲得響應的機制。另外值得注意的是,Oracle 12c有built-in JSON handling;在早期版本中,您可以使用第三方PL/JSON modulewhich seems to handle CLOBs

+0

謝謝你們,**它對我來說工作得很好。** –

相關問題