XML 値を構成するための関数

いくつかの SQL/XML 公開関数を組み合わせて使用して、リレーショナル・データを XML フォーマットで公開することができます。

以下の関数があります。

XMLAGG 集約関数
XML 値のセットの中の NULL 以外の値ごとに 1 つずつ項目を収めた、XML シーケンスを戻します。
XMLATTRIBUTES スカラー関数
引数から XML 属性を作成します。 この関数は、XMLELEMENT 関数の引数としてのみ使用できます。
XMLCOMMENT スカラー関数
入力引数の内容を含む、単一のコメント・ノードを持った XML 値を戻します。
XMLCONCAT スカラー関数
可変数の XML 入力引数の連結を含むシーケンスを戻します。
XMLDOCUMENT スカラー関数
ゼロ個以上の下位ノードを持った単一の文書ノードを持つ XML 値を戻します。

この関数は文書ノードを作成します。これは、定義上、すべての XML 文書が持つ必要のあるものです。 文書ノードは XML のテキスト表記では不可視ですが、Db2 表に保管されるすべての文書には文書ノードが含まれていなければなりません。

XML 値を XML 列に挿入するとき、または XML 値を使って XML 列を更新するときには、XMLDOCUMENT を呼び出す必要がありません。 Db2 ドキュメントノードを暗黙的に追加します。 例えば、以下の INSERT ステートメントは XMLDOCUMENT を明示的に呼び出して値 COL2 を挿入します。

INSERT INTO T1 (INT1,XML1)                     
SELECT X.COL1, XMLDOCUMENT(X.COL2)             
FROM XMLTABLE('/A/B' PASSING CAST (? AS XML)   
       COLUMNS COL1 INTEGER PATH '@id',        
               COL2 XML PATH '.') X;           

ただし XMLDOCUMENT は省略できます。その場合、COL2 用の文書ノードが Db2 によって暗黙的に追加されます。

INSERT INTO T1 (INT1,XML1)                     
SELECT X.COL1, X.COL2             
FROM XMLTABLE('/A/B' PASSING CAST (? AS XML)   
       COLUMNS COL1 INTEGER PATH '@id',        
               COL2 XML PATH '.') X;           
XMLELEMENT スカラー関数
XML エレメント・ノードである XML 値を戻します。
XMLFOREST スカラー関数
XML エレメント・ノードのシーケンスである XML 値を戻します。
XMLNAMESPACES 宣言
引数から名前空間宣言を作成します。 この宣言は、XMLELEMENT または XMLFOREST 関数の引数としてのみ使用できます。
XMLPI スカラー関数
単一の処理命令ノードを持った XML 値を戻します。
XMLTEXT スカラー関数
入力引数の内容を含む、単一のテキスト・ノードを持った XML 値を戻します。

これらの関数を組み合わせて、異なるタイプのノードが含まれる XML 値を構成できます。 対応するエレメントの表示順に関数を指定する必要があります。

例 1

定数値を持つ以下の文書を構成する場合を考えてみます。
<elem1 xmlns="http://posample.org" id="111">
  <!-- example document -->
  <child1>abc</child1>
  <child2>def</child2>
</elem1>
文書は、以下から構成されます。
  • 3 つのエレメント・ノード (elem1child1 および child2)
  • ネーム・スペース宣言
  • elem1 上の id 属性
  • コメント・ノード
この文書を構成するには、以下の順序で公開関数を呼び出す必要があります。
  1. XMLELEMENT を使用して、elem1 という名前のエレメント・ノードを作成します。
  2. XMLNAMESPACES を使用して、デフォルトのネーム・スペース宣言を elem1 の XMLELEMENT 関数呼び出しに追加します。
  3. XMLATTRIBUTES を使用して id という名前の属性を作成し、 それを XMLNAMESPACES 宣言の後に置きます。
  4. XMLCOMMENT を使用して elem1 の XMLELEMENT 関数呼び出しの中にコメント・ノードを作成します。
  5. XMLFOREST 関数を使用して child1 および child2 という 名前のエレメント・ノードのシーケンスを elem1 の XMLELEMENT 関数呼び出しの中に作成します。
以下の SELECT ステートメントで文書を構成します。
SELECT XMLELEMENT (NAME "elem1",
  XMLNAMESPACES (DEFAULT 'http://posample.org'),
  XMLATTRIBUTES ('111' AS "id"),
  XMLCOMMENT (' example document '),
  XMLFOREST('abc' as "child1",
  'def' as "child2"))
  FROM SYSIBM.SYSDUMMY1

例 2

サンプルの Product 表の Description 列にある name エレメントから XML 文書 を構成する場合を考えてみます。

Description 列の文書は、以下のようなものです。
<product xmlns="http://posample.org" pid="100-100-01"> 
 <description>                                            
  <name>Snow Shovel, Basic 22"</name>                     
  <details>Basic Snow Shovel, 22" wide, straight handle with D-Grip</details>
  <price>9.99</price>                                     
  <weight>1 kg</weight>                                   
 </description>                                           
</product>
以下のような構成文書を作成したいとします。
<allProducts xmlns="http:⁄⁄posample.org">
  <item>Snow Shovel, Basic 22"<⁄item>
  <item>Snow Shovel, Deluxe 24"<⁄item>
  <item>Snow Shovel, Super Deluxe 26"<⁄item>
  <item>Ice Scraper, Windshield 4" Wide<⁄item>
<⁄allProducts>
文書は、以下から構成されます。
  • 5 つのエレメント・ノード (allProducts と 4 つの item エレメント)
  • ネーム・スペース宣言
この文書を構成するには、以下の順序で公開関数を呼び出す必要があります。
  1. XMLELEMENT を使用して、allProducts という名前のエレメント・ノードを作成します。
  2. XMLNAMESPACES を使用して、デフォルトのネーム・スペース宣言を allProducts の XMLELEMENT 関数呼び出しに追加します。
  3. XMLELEMENT 関数を使用して、エレメント item ノードのシーケンス を XMLAGG 関数呼び出しの中に作成します。
以下の SELECT ステートメントで文書を構成します。
SELECT XMLELEMENT (NAME "allProducts",
                   XMLNAMESPACES (DEFAULT 'http://posample.org'),
                   XMLAGG(XMLELEMENT (NAME "item", p.name)))
FROM Product p

例 3

サンプルの Product 表の Description 列にある name エレメントと、 サンプルの Inventory 表の Quantity 列値から XML 文書を構成する場合を考えてみます。 Product 表と Quantity 表の結合列は、Pid 列です。

以下のような XML 文書を生成したいとします。
<saleProducts xmlns="http:⁄⁄posample.org">
  <prod id="100-100-01">
    <name>Snow Shovel 22"<⁄name>
    <numInStock>5<⁄numInStock>
  <⁄prod>
  <prod id="100-101-01">
    <name>Snow Shovel 24"<⁄name>
    <numInStock>25<⁄numInStock>
  <⁄prod>
  <prod id="100-103-01">
    <name>Deluxe Snow Shovel 26"<⁄name>
    <numInStock>55<⁄numInStock>
  <⁄prod>
  <prod id="100-201-01">
    <name>Ice Scraper 4"<⁄name>
    <numInStock>99<⁄numInStock>
  <⁄prod>
<⁄saleProducts>
文書は、以下から構成されます。
  • 13 のエレメント・ノード (saleProducts と、 それぞれに name エレメントと numInStock エレメントが含まれている 4 つの prod エレメント)
  • ネーム・スペース宣言
この文書を構成するには、以下の順序で公開関数を呼び出す必要があります。
  1. XMLELEMENT を使用して、saleProducts という名前のエレメント・ノードを作成します。
  2. XMLNAMESPACES を使用して、デフォルトのネーム・スペース宣言を saleProducts の XMLELEMENT 関数呼び出しに追加します。
  3. 以下の関数呼び出しを使用して、エレメント prod ノードのシーケンス を XMLAGG 関数呼び出しの中に作成し、prod ノードを構成します。
    1. XMLELEMENT (prod ノードを作成する)
    2. XMLATTRIBUTES (id 属性を各 prod エレメントに追加する)
    3. XMLFOREST (name および numInStock エレメントを構成する)
以下の SELECT ステートメントで文書を構成します。
SELECT XMLELEMENT (NAME "saleProducts",
                   XMLNAMESPACES (DEFAULT 'http://posample.org'),
                   XMLAGG (XMLELEMENT (NAME "prod",
                           XMLATTRIBUTES (p.Pid AS "id"),
                           XMLFOREST (p.name as "name",
                                      i.quantity as "numInStock"))))
FROM PRODUCT p, INVENTORY i
WHERE p.Pid = i.Pid

例 4

XMLELEMENT または XMLFOREST を使用して XML 値を構成する際に、 ソース表に NULL 値がある可能性があります。 XMLELEMENT および XMLFOREST の EMPTY ON NULL および NULL ON NULL オプションを使用して、関数が NULL 値を検出したときに空のエレメントを生成するかまたはエレメントを生成しないかを指定できます。 XMLELEMENT のデフォルトの NULL 処理は、EMPTY ON NULL です。 XMLFOREST のデフォルトの NULL 処理は、NULL ON NULL です。

INVENTORY 表の LOCATION 列の 1 つの行に NULL 値が含まれているとします。 LOCATION 値が NULL の場合は、空のシーケンスが含まれている LOCATION 列からエレメントを構成したいとします。 このような場合は、以下の SELECT ステートメントで文書を構成します。
SELECT XMLELEMENT (NAME "newElem",
                   XMLATTRIBUTES (PID AS "prodID"),
                   XMLFOREST (QUANTITY as "quantity",
                              LOCATION as "loc" OPTION EMPTY ON NULL))
FROM INVENTORY