2017-08-11 94 views
0

我試圖從存儲在CLOB列中的XML中提取信息。我搜索了論壇,並因此一直無法根據需要獲取數據。我對SQL有一個基本的理解,但這超出了我的理解。如何從SQL CLOB獲取XML鍵「值」

的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」。

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

我想獲得它,所以我可以拉「12345」指定爲「值」,在「佐野」(最終得到了其他領域的價值,但希望至少拿到一個工作第一) 。

回答

1

您當前正在檢索節點的文本值,但12345是元素的值屬性而非其文本內容。所以,你會需要使用@attribute語法,即:

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

SANO     
-------------------- 
12345 

extractvalue is deprecated;假設你在最近版本的Oracle,這將是最好使用XMLQuery

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

您可能會發現它更容易使用的XMLTable - 必要的,如果一個XML文檔有多個Address節點,但即使只是一個拉出來的值作爲列會降低重複性,它可以更容易地獲取合適的數據類型:

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  

Read more有關使用這些功能來查詢XML數據。

+0

這三個例子都很棒!而且,是的,第三個使用XMLTABLE將是最簡單的。非常感謝! – JayRod