Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从clob检索超过4000个字符的XML数据_Xml_Oracle_Clob - Fatal编程技术网

从clob检索超过4000个字符的XML数据

从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

我有以下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), '/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'
);
我猜plain
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'
);

你在11g上吗?12c?Oracle版本=12.1.0.2.0您看到了吗?我将使用第二个版本,它将提供我需要的结果。谢谢