从clob检索超过4000个字符的XML数据
我有以下Oracle查询,它从clob列(mytable.personalization\u数据)返回数据。如果clob值小于4,00个字符,它可以正常工作,但如果它大于4,00个字符,我会收到“ORA-01706:用户函数结果值太大”错误消息 以下是sql:从clob检索超过4000个字符的XML数据,xml,oracle,clob,Xml,Oracle,Clob,我有以下Oracle查询,它从clob列(mytable.personalization\u数据)返回数据。如果clob值小于4,00个字符,它可以正常工作,但如果它大于4,00个字符,我会收到“ORA-01706:用户函数结果值太大”错误消息 以下是sql: select name_str, value_str, order_str from ( SELECT XMLTYPE(EXTRACTVALUE(XMLTYPE(personalization_data), '/personalizat
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>
1234567
1.
姓
维科夫
2.
名字
伊万娜
]]>
有人能提供建议吗?所以。。。问题是EXTRACTVALUE只返回VARCHAR2。你用它来移除
从数据
节点进行填充,因此您可以再次将其解析为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'
);
我猜plainsubstr
可以处理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'
);
你在11g上吗?12c?Oracle版本=12.1.0.2.0您看到了吗?我将使用第二个版本,它将提供我需要的结果。谢谢