チュートリアル: XML データの処理

pureXML 機能により、各行に単一の整形式 XML 文書を保管する表の列を定義できます。 このチュートリアルでは、XML データを保管する Db2 データベース・システムをセットアップする方法、および XML データを使用して基本操作を実行する方法について説明します。

始める前に

  • SPUFI セッションを開始するか、DSNTEP2 ジョブを作成します。DSNTEP2 は、この演習の SQL ステートメントを実行するために使用できるジョブです。
  • SQL の終止符をセミコロン以外の文字 (番号記号 (#) など) に設定します。そうすれば、SQL ステートメントにセミコロンを組み込めます。
  • SPUFI を使用する場合、以下の設定も変更します。
    • CAPS OFF に設定します。そうすれば、ISPF エディターで入力内容が大文字に変換されません。
    • CURRENT SPUFI DEFAULTS パネルで MAX CHAR FIELD を 32767 に変更します。そうすれば、完全な XML 文書を表示できます。

プロシージャー

  1. XML 列を含む MYCUSTOMER という名前の表を作成します。
    CREATE TABLE MYCUSTOMER (Cid BIGINT, INFO XML)#
  2. XML データに対する索引を作成する。 このチュートリアルの目的として INFO 列に保管するすべての XML 文書に、Cid という属性を持つ customerinfo という名前のルート・エレメントを持つようにします その Cid 属性で固有索引を作成します。
    CREATE UNIQUE INDEX MYCUT_CID_XMLIDX ON MYCUSTOMER(INFO) 
    GENERATE KEY USING XMLPATTERN
      'declare default element namespace "http://posample.org"; /customerinfo/@Cid'
    AS SQL DECFLOAT#

    索引を定義する XML パターンは、大/小文字を区別します。 XML パターン内のエレメントおよび属性名は、XML 文書内のエレメントおよび属性名に正確に一致しなければなりません。 この例では、customerinfo はエレメントであり、Cid は属性です。

  3. 以下の INSERT ステートメントを発行して、ステップ 1 で作成した MYCUSTOMER 表に 3 つの XML 文書を挿入します。
    INSERT INTO MYCUSTOMER (CID, INFO) VALUES (1000, 
    '<customerinfo xmlns="http://posample.org" Cid="1000"> 
      <name>Kathy Smith</name> 
      <addr country="Canada"> 
        <street>5 Rosewood</street> 
        <city>Toronto</city> 
        <prov-state>Ontario</prov-state> 
        <pcode-zip>M6W 1E6</pcode-zip> 
      </addr> 
      <phone type="work">416-555-1358</phone> 
    </customerinfo>')#
    
    INSERT INTO MYCUSTOMER (CID, INFO) VALUES (1002, 
    '<customerinfo xmlns="http://posample.org" Cid="1002"> 
      <name>Jim Noodle</name> 
      <addr country="Canada"> 
        <street>25 EastCreek</street> 
        <city>Markham</city> 
        <prov-state>Ontario</prov-state> 
        <pcode-zip>N9C 3T6</pcode-zip> 
      </addr> 
      <phone type="work">905-555-7258</phone> 
    </customerinfo>')#
    
    INSERT INTO MYCUSTOMER (CID, INFO) VALUES (1003, 
    '<customerinfo xmlns="http://posample.org" Cid="1003"> 
      <name>Robert Shoemaker</name> 
      <addr country="Canada"> 
        <street>1596 Baseline</street> 
        <city>Aurora</city> 
        <prov-state>Ontario</prov-state> 
        <pcode-zip>N8X 7F8</pcode-zip> 
      </addr> 
      <phone type="work">905-555-2937</phone> 
    </customerinfo>')#

    以下の照会を実行することによって、レコードが正常に挿入されたことを確認できます。

    SELECT CID, INFO FROM MYCUSTOMER#
  4. XML 列に保管された XML 文書を更新します。 以下の UPDATE ステートメントを実行して、CID 列の値が 1002 である XML 文書に、携帯電話番号を追加します。 XML 列の個々の項目を変更するには、列全体を置き換える必要があります。
    UPDATE MYCUSTOMER SET INFO = 
    '<customerinfo xmlns="http://posample.org" Cid="1002"> 
      <name>Jim Noodle</name> 
      <addr country="Canada"> 
        <street>25 EastCreek</street> 
        <city>Markham</city> 
        <prov-state>Ontario</prov-state> 
        <pcode-zip>N9C 3T6</pcode-zip> 
      </addr> 
      <phone type="work">905-555-7258</phone> 
      <phone type="cell">905-554-7254</phone> 
     </customerinfo>'
    WHERE CID=1002#

    以下の照会を発行して、XML 文書が更新されたことを確認できます。

    SELECT CID, INFO FROM MYCUSTOMER
     WHERE CID=1002#
  5. 列 INFO の顧客文書に携帯電話番号が含まれている行を MYCUSTOMER 表から削除します。 削除したいドキュメントを指定するために、 XQuery 式を含む XMLEXISTS 述語を含む以下の DELETE 文を発行します。
    DELETE FROM MYCUSTOMER 
    WHERE XMLEXISTS (
     'declare default element namespace "http://posample.org";
     /customerinfo/phone[@type="cell"]' PASSING INFO)# 

    以下の照会を発行して、XML 文書が削除されたことを確認できます。

    SELECT COUNT(*) FROM MYCUSTOMER
    WHERE CID = 1002#
    

    結果の値が 0 になっていることを確認します。

  6. XML データを照会します。
    XML 文書全体を検索することも、一部の XML 文書を検索することも可能です。
    • CID 値が 1000 である XML 文書全体を取り出す場合は、以下の SELECT ステートメントを実行してください。
      SELECT CID, INFO FROM MYCUSTOMER
       WHERE CID=1000#
    • MYCUSTOMER 表の各 XML 文書から name エレメントを取り出すには、XMLQUERY 関数を指定した以下の SELECT ステートメントを実行してください。
      SELECT XMLQUERY (
        'declare default element namespace "http://posample.org";
         for $d in $doc/customerinfo
         return <out>{$d/name}</out>'
         passing INFO as "doc") 
        FROM MYCUSTOMER as c
        WHERE XMLEXISTS ('declare default element namespace "http://posample.org";
         $i/customerinfo/addr[city="Toronto"]' passing c.INFO as "i")#                                      
    この SELECT ステートメントは、次の結果を 戻します。
    <out xmlns="http://posample.org"><name>Kathy Smith</name></out>
  7. XML 文書の一部を更新します。 XMLMODIFY 関数を含む以下の UPDATE ステートメントを実行して、MYCUSTOMER 表で顧客 ID が 1000 の 顧客について、住所を 5 Rosewood から 42 Rosedale に 変更します。
    UPDATE MYCUSTOMER
     SET INFO = XMLMODIFY(
      'declare default element namespace "http://posample.org";
      replace value of node /customerinfo/addr/street
      with "42 Rosedale"')
     WHERE CID=1000#
    

    以下の照会を発行して、XML 文書が更新されたことを確認できます。

    SELECT CID, INFO FROM MYCUSTOMER
     WHERE CID = 1000#
    

    関連情報