首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从大于4,000个字符的clob中检索XML数据

从大于4,000个字符的clob中检索XML数据
EN

Stack Overflow用户
提问于 2017-11-01 19:32:53
回答 1查看 2.5K关注 0票数 1

我有下面的Oracle,它从clob列(mytable.personalization_data)返回数据。如果clob值小于4,00个字符,它可以正常工作,但如果它更多,则会得到"ORA-01706:用户函数结果值太大“的错误消息。

下面是sql:

代码语言:javascript
复制
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:

代码语言:javascript
复制
<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>

有谁能提出建议吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-11-01 20:46:32

所以..。问题是EXTRACTVALUE只返回VARCHAR2。您正在使用它从data节点中删除data内容,因此您可以将其第二次解析为XML。事实证明,Oracle允许您在SQL中漂亮地打印XML或修改阻塞的大多数方法都会返回VARCHAR2。

我想我想出了一些应该可以工作的东西,使用xpath函数来摆脱CDATA包装器,并消除结果。这有点尴尬,我相信一定有更好的方法去做,但我找不到。

代码语言:javascript
复制
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可以处理clobs,但这并不是一个很大的改进。

代码语言:javascript
复制
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'
);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47062360

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档