2017-08-11 12 views
0

CLOB列に格納されたXMLから情報を抽出しようとしています。私はフォーラムを検索し、これまで必要に応じてデータを取得することができませんでした。私はSQLの基本的な理解を持っているが、これは私の外にある。SQLからXMLキー「値」を取り出す方法CLOB

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」(最終的には他のフィールドの値を取得しますが、少なくとも一つは、最初の作業を取得したい)「SANO」で「値」として割り当てを引くことができ、それを取得しようとしています。

答えて

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。あなたはそれをさらに容易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; 

- XML文書が複数Addressノードがある場合は必要に応じて、それでも持つ:XMLQueryを使用する方が良いでしょうあなたがオラクルの最新のバージョンにしていると仮定するとただ一つの列が少ない反復であるような値を引き出し、それはそれが簡単に、適切なデータ型を取得することができます:

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

3つの例はすべて素晴らしいです!そして、はい、XMLTABLEを使用する3番目の方法が最も簡単になります。どうもありがとうございます! – JayRod

関連する問題