“如何提取XML密钥”;“价值”;从SQL CLOB

“如何提取XML密钥”;“价值”;从SQL CLOB,sql,xml,oracle,xml-parsing,clob,Sql,Xml,Oracle,Xml Parsing,Clob,我试图从CLOB列中存储的XML中提取信息。我已经搜索了论坛,到目前为止还无法获得需要的数据。我对SQL有基本的了解,但这是我无法理解的 XML类似于以下内容: <?xml version="1.0" encoding="UTF-8"?> <Response> <Header> <OrderNum value="12354321"/> <ExtractDate value="11-30-2012"/&

我试图从CLOB列中存储的XML中提取信息。我已经搜索了论坛,到目前为止还无法获得需要的数据。我对SQL有基本的了解,但这是我无法理解的

XML类似于以下内容:

<?xml version="1.0" encoding="UTF-8"?>

<Response>
    <Header>
        <OrderNum value="12354321"/>
        <ExtractDate value="11-30-2012"/>
        <RType value="Status"/>
        <Company value="Company"/>
    </Header>
    <Body>
        <Status>
            <Order>
                <ActivityType value="ValidateRequest"/>
                <EndUser>
                    <Name value="Schmo, Joe"/>
                    <Address>
                        <SANO value="12345"/>
                        <SASN value="Mickey Mouse"/>
                        <SATH value="Lane"/>
                        <SASS value="N"/>
                        <City value="Orlando"/>
                        <State value="FL"/>
                        <Zip value="34786"/>
                        <Number value="5550000"/>
                    </Address>
                </EndUser>
                <COS value="1"/>
                <TOS value="3"/>
                <MainNumber value="5550000"/>
            </Order>
            <ErrorCode value="400"/>
            <ErrorMessage value="RECEIVED"/>
        </Status>
    </Body>
</Response>

我想得到“地址”下的值

我尝试了以下操作,但返回“NULL”

选择EXTRACTVALUE(XMLTYPE(RESPONSE_CLOB),'/RESPONSE/Body/Status/Order/EndUser/Address/SANO')作为SANO
从应答表
其中ROWNUM<2

我正在尝试获取它,以便可以提取在“SANO”中指定为“value”的“12345”(最终获取其他字段的值,但希望至少先获取一个字段的值)。

您当前正在检索节点的文本值,但12345是元素的value属性,而不是其文本内容。因此,您需要使用
@属性
语法,即:

SELECT EXTRACTVALUE(XMLTYPE(RESPONSE_CLOB),'/Response/Body/Status/Order/EndUser/Address/SANO/@value') AS SANO
FROM RESPONSE_TABLE
WHERE ROWNUM < 2;

SANO                
--------------------
12345
如果一个XML文档有多个
Address
节点,您可能会发现使用-required更容易,但即使只使用一个节点,将值作为列拉出也会减少重复性,并使检索合适的数据类型更容易:

select x.*
from response_table rt
cross join xmltable(
  '/Response/Body/Status/Order/EndUser/Address'
  passing xmltype(rt.response_clob)
  columns sano number path 'SANO/@value',
    sasn varchar2(30) path 'SASN/@value',
    sath varchar2(10) path 'SATH/@value'
    -- etc.
) x
where rownum < 2;

                SANO SASN                           SATH      
-------------------- ------------------------------ ----------
               12345 Mickey Mouse                   Lane      
选择x*
从响应表rt
交叉连接xmltable(
“/Response/Body/Status/Order/EndUser/Address”
传递xmltype(rt.response\u clob)
列sano编号路径“sano/@value”,
sasn varchar2(30)路径“sasn/@value”,
sath varchar2(10)路径“sath/@value”
--等等。
)x
其中rownum<2;
萨诺·萨森·萨思
-------------------- ------------------------------ ----------
米老鼠巷12345号

关于使用这些函数查询XML数据。

这三个示例都非常有用!是的,第三种使用XMLTABLE的方法将是最简单的。非常感谢你!
SELECT XMLQUERY(
  '/Response/Body/Status/Order/EndUser/Address/SANO/@value'
  PASSING XMLTYPE(RESPONSE_CLOB)
  RETURNING CONTENT
  ) AS SANO
FROM RESPONSE_TABLE
WHERE ROWNUM < 2;
select x.*
from response_table rt
cross join xmltable(
  '/Response/Body/Status/Order/EndUser/Address'
  passing xmltype(rt.response_clob)
  columns sano number path 'SANO/@value',
    sasn varchar2(30) path 'SASN/@value',
    sath varchar2(10) path 'SATH/@value'
    -- etc.
) x
where rownum < 2;

                SANO SASN                           SATH      
-------------------- ------------------------------ ----------
               12345 Mickey Mouse                   Lane