2017-11-01 17 views
1

clob 열 (mytable.personalization_data)에서 데이터를 반환하는 다음 Oracle 쿼리가 있습니다. CLOB 값이 4,00 자보다 작 으면 잘 작동하지만 더 많으면 "ORA-01706 : 사용자 함수 결과 값이 너무 큼"오류 메시지가 나타납니다.4,000자를 초과하는 clob에서 XML 데이터 검색

select name_str, value_str, order_str 
from 
(
SELECT 
XMLTYPE(EXTRACTVALUE(XMLTYPE(personalization_data), '/personalizations/personalization[1]/data')) persData 
FROM my_table 
), 
XMLTable('/Accessories/Personalization/PersonalizationItems' 
    PASSING persData 
    COLUMNS 
     name_str varchar2(100) PATH 'DisplayName', 
     value_str varchar2(2000) PATH 'Value', 
     order_str varchar2(10) PATH 'SortOrder' 
); 

샘플 XML :

<personalizations> 
    <personalization> 
     <data> 
      <![CDATA[ 
      <Accessories> 
       <AccessoryId>1234567</AccessoryId> 
       <Personalization> 
        <PersonalizationItems> 
         <SortOrder>1</SortOrder> 
         <DisplayName>Last Name</DisplayName> 
         <Value>Veekoff</Value> 
        </PersonalizationItems> 
        <PersonalizationItems> 
         <SortOrder>2</SortOrder> 
         <DisplayName>First Name</DisplayName> 
         <Value>Ivana</Value> 
        </PersonalizationItems> 
       </Personalization> 
      </Accessories> 
      ]]> 
     </data> 
    </personalization> 
</personalizations> 

누군가가 제안을 주 시겠어요 여기서

는 SQL입니까?

+0

11g이십니까? 12c? – kfinity

+0

오라클 버전 = 12.1.0.2.0 –

+0

당신은 https://stackoverflow.com/questions/16540132/oracle-view-more-than-4000-bytes-in-column을 보았습니까? – thatjeffsmith

답변

0

그래서 ... 문제는 EXTRACTVALUE가 VARCHAR2 만 반환한다는 것입니다. 그리고이를 사용하여 data 노드에서 <![CDATA[ 항목을 제거하므로 두 번째 XML로 구문 분석 할 수 있습니다. 오라클이 XML로 예쁘게 인쇄하거나 SQL에서 clob in-place를 변경할 수있는 대부분의 방법은 VARCHAR2를 반환합니다.

필자는 xpath 함수를 사용하여 CDATA 래퍼를 제거하고 결과를 이스케이프 처리해야하는 작업을 생각해 냈습니다. 조금 어색하고 더 나은 방법이 있어야한다고 확신하지만 찾을 수 없습니다.

select name_str, value_str, order_str 
from 
(
SELECT XMLTYPE(DBMS_XMLGEN.CONVERT(
    XMLQUERY('/personalizations/personalization[1]/data/substring(text(),9,string-length(text())-12)' passing XMLTYPE(personalization_data) returning content).getClobVal() 
    , 1)) persData 
FROM my_table 
), 
XMLTable('/Accessories/Personalization/PersonalizationItems' 
    PASSING persData 
    COLUMNS 
     name_str varchar2(100) PATH 'DisplayName', 
     value_str varchar2(2000) PATH 'Value', 
     order_str varchar2(10) PATH 'SortOrder' 
); 

나는 CLOB를 처리 할 수 ​​substr 일반 추측하지만, 개선의 많은 아니다.

select name_str, value_str, order_str 
from 
(
SELECT XMLTYPE(substr(pData, 10, length(pData)-12)) persData 
from (select 
    XMLQUERY('/personalizations/personalization[1]/data/text()' passing XMLTYPE(personalization_data) returning content).getClobVal() as pData 
    FROM my_table) 
), 
XMLTable('/Accessories/Personalization/PersonalizationItems' 
    PASSING persData 
    COLUMNS 
     name_str varchar2(100) PATH 'DisplayName', 
     value_str varchar2(2000) PATH 'Value', 
     order_str varchar2(10) PATH 'SortOrder' 
); 
+0

두 번째 버전과 함께 할 것이므로 필요한 결과를 제공하고 있습니다. 감사. –