2016-03-31 12 views
0

現在、私のデータベースに格納されているxml CLOB値からplsqlを使用していくつかの値を抽出する方法を理解しようとしています。SQLを使用してxmlから値を抽出するCLOB

マイCLOB値は、次のようになります。

<map> 
    <entry> 
    <string>HeaderOne</string> 
    <string> 
     <linked-hash-map> 
      <entry> 
       <string>ID</string> 
       <string>81</string> 
      </entry> 
      <entry> 
       <string>Name</string> 
       <string>John</string> 
      </entry> 
      <entry> 
       <string>SecondName</string> 
       <string>Smith</string> 
      </entry> 
      <entry> 
       <string>Age</string> 
       <string>15</string> 
      </entry> 
     </linked-hash-map> 
    </string> 
    </entry> 
    <entry> 
    <string>HeaderTwo</string> 
    <string> 
     <linked-hash-map> 
      <entry> 
       <string>ID</string> 
       <string>81</string> 
      </entry> 
      <entry> 
       <string>ZIP</string> 
       <string>99999</string> 
      </entry> 
      <entry> 
       <string>Gender</string> 
       <string>M</string> 
      </entry> 
     </linked-hash-map> 
    </string> 
    </entry> 
</map> 

、ここで説明したように私はEXTRAC(XMLTypeの(myclob)メソッドを使用してみました: Extract data from XML Clob using SQL from Oracle Database

をしかし、これはので、私の場合には動作しません。 <string>タグには 'name'や 'key'などの識別子は含まれていませんが、別の<string>エントリが実際の値よりも上にリストされます。を使用します。実価私は抽出されたい。

パラメータはXMLで任意の順序でリストできますが、抽出したいパラメータの名前はわかります。だから私の質問は、<string>Name</string>のエントリから値を抽出する方法があるのです(この場合は「John」ですが、任意の値にすることができます)

+0

したがって、 ''の中の ''要素の順序は、それが属性名か値かを決定するでしょうか? – ruudvan

+0

はいあなたは正しく仮定します – SQLNewbie

答えて

0

あなたが好きな場合は、出力を探すことができますPIVOTそのようなXMLをどのように読むのかについては、ここをクリックしてください。

簡単にするため、XMLがXMLTYPE型のmy_xmlという名前の変数の内部にあると仮定します。

SELECT header_string, attribute_name, attribute_value 
    FROM (WITH xm AS (SELECT my_xml AS x FROM DUAL) 
     SELECT header_string, linked_hash_map 
      FROM xm, 
       XMLTABLE (
        '//map/entry' 
        PASSING xm.x 
        COLUMNS header_string VARCHAR2 (100) PATH 'string[1]', 
          linked_hash_map XMLTYPE PATH 'string[2]/linked-hash-map')) 
     l, 
     XMLTABLE (
      '//linked-hash-map/entry' 
      PASSING l.linked_hash_map 
      COLUMNS attribute_name VARCHAR2 (100) PATH 'string[1]', 
        attribute_value VARCHAR2 (100) PATH 'string[2]'); 

可能であれば、XMLスキーマを改善する方法を探してください。この質問から、キーの名前が実際のデータではなく要素のプロパティ(要素名ではない場合)のキー値のペアを使用する方がよいことはすでにわかっているようです。

また、EXTRACTまたはEXTRACTVALUEを使用しないでください。これらの関数はオラクル社によって廃止されました。代わりにXMLTABLEまたはXMLQUERYを使用してください。

+0

答えをありがとう、私は後でそれをチェックアウトし、結果を報告します! – SQLNewbie

+0

偉大な解決策は、魅力のように動作します! – SQLNewbie

関連する問題