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 つのエレメント・ノード (
elem1、child1およびchild2) - ネーム・スペース宣言
elem1上のid属性- コメント・ノード
- XMLELEMENT を使用して、
elem1という名前のエレメント・ノードを作成します。 - XMLNAMESPACES を使用して、デフォルトのネーム・スペース宣言を
elem1の XMLELEMENT 関数呼び出しに追加します。 - XMLATTRIBUTES を使用して
idという名前の属性を作成し、 それを XMLNAMESPACES 宣言の後に置きます。 - XMLCOMMENT を使用して
elem1の XMLELEMENT 関数呼び出しの中にコメント・ノードを作成します。 - XMLFOREST 関数を使用して
child1およびchild2という 名前のエレメント・ノードのシーケンスをelem1の XMLELEMENT 関数呼び出しの中に作成します。
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 文書
を構成する場合を考えてみます。
<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エレメント) - ネーム・スペース宣言
- XMLELEMENT を使用して、
allProductsという名前のエレメント・ノードを作成します。 - XMLNAMESPACES を使用して、デフォルトのネーム・スペース宣言を
allProductsの XMLELEMENT 関数呼び出しに追加します。 - XMLELEMENT 関数を使用して、エレメント
itemノードのシーケンス を XMLAGG 関数呼び出しの中に作成します。
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 列です。
<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エレメント) - ネーム・スペース宣言
- XMLELEMENT を使用して、
saleProductsという名前のエレメント・ノードを作成します。 - XMLNAMESPACES を使用して、デフォルトのネーム・スペース宣言を
saleProductsの XMLELEMENT 関数呼び出しに追加します。 - 以下の関数呼び出しを使用して、エレメント
prodノードのシーケンス を XMLAGG 関数呼び出しの中に作成し、prodノードを構成します。- XMLELEMENT (
prodノードを作成する) - XMLATTRIBUTES (
id属性を各prodエレメントに追加する) - XMLFOREST (
nameおよびnumInStockエレメントを構成する)
- XMLELEMENT (
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 です。
SELECT XMLELEMENT (NAME "newElem",
XMLATTRIBUTES (PID AS "prodID"),
XMLFOREST (QUANTITY as "quantity",
LOCATION as "loc" OPTION EMPTY ON NULL))
FROM INVENTORY