2017-11-01 33 views
1

clob列(mytable.personalization_data)からデータを返す次のOracleクエリがあります。 CLOB値が4,00文字未満の場合は正常に動作しますが、それ以上であれば、「ORA-01706:ユーザー関数の結果値が大きすぎます」というエラーメッセージが表示されます。ここで4,000文字以上のclobからXMLデータを取得する

はsqlです:

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> 

誰かがアドバイスを提供していただけますか?

+0

11gですか? 12c? – kfinity

+0

Oracleバージョン= 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[のものを削除するために使用しているので、2度目にXMLとして解析できます。 これは、OracleでXMLをきれいに印刷したり、SQLでclobをインプレースで変更できるようにするほとんどの方法で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' 
); 

私は無地substrがCLOBのを扱うことができると思いますが、それは改善の多くはありません。

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

私は2番目のバージョンでは、私に必要な結果を与えています。ありがとう。 –

関連する問題