2016-11-08 7 views
2

나는 다음 등의 SDO_GEOMETRY 필드에이 http://pastebin.com/cKXnCqx7 형상을 삽입하는 것을 시도하고있다 :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 청크로 빌드해야합니다. (첫 번째 코드 [here] (http://stackoverflow.com/a/17359646/266304)와 마찬가지로) 더 좋은 예가 있다고 확신합니다. 그러나 그 문자열은 어디에서 오는가? 예를 들어 파일에서 읽을 수 있습니까? –

+0

** 문자열 ** –

+0

문자열 인 것을 알 수 있습니다. 길이가 32 자 이상인 문자열입니다. 즉, 변수에 직접 지정할 수 없습니다. 문자열 리터럴의 최대 길이는 PL/SQL에서 32k입니다. 코드에 입력하지 않았습니다. 파일에서 복사하여 붙여 넣기 하시겠습니까? 그렇다면 그 파일을 어딘가에 넣으면'utl_file'으로 읽을 수 있습니까? 그렇지 않으면 전체 CLOB 값을 생성하기 위해 문자열을 수동으로 작은 덩어리로 잘라야합니다. –

답변

4

리터럴 문자열의 최대 크기는 32K입니다 PL/SQL에서. 오류의 원인이되는 98K + 리터럴을 지정하려고합니다. (이는 4KB를 참조하기 때문에 사용자가 보여준 PL/SQL 블록이 아닌 일반 SQL 호출에서 발생하는 것으로 보이지만). CLOB에서 sdo_geometry 오브젝트를 작성하려고 시도하지 않습니다.

CLOB를 제공하는 파일 또는 다른 메커니즘에서 값을로드하는 것이 가장 이상적입니다. 리터럴로 취급해야한다면 수동으로 덩어리로 분리해야합니다.

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

당신은 덩어리가 작게 만들 수 있으며, 어떤면에서 더 관리 할 수 ​​있습니다 더 많은 추가를 가지고 있지만, 설정하는 더 많은 작업입니다 : 최소 4이 값으로 당신은 그들이 큰 수 있도록합니다. 수동으로해도 여전히 고통 스럽습니다. 따라서 다른 방법으로는 얻을 수없는 경우 이것이 최후의 수단 일 것입니다.


문자열이는 HTTP에서 오는 경우

dbms_lob.append를 사용하여 같은 방법으로 청크 응답을 읽고 많은에 당신이 그것을 읽은 상태로 CLOB로 변환 할 수 있습니다 호출합니다. 정확히 어떻게 현재 응답을 얻기 위해 사용하고있는 메커니즘에 따라 달라집니다. 또한 Oracle 12c에는 built-in JSON handling이 있음을 알 수 있습니다. 이전 버전에서는 타사 PL/JSON module, which seems to handle CLOBs을 사용할 수 있습니다.

+0

감사합니다. ** ** 나를 잘 처리했습니다. ** –