Page   | 1  | 2  | 3  | 4  |

【RDBとの違いが明快に分かる】
これだけは押さえておきたい
XML-DBの基本操作とその仕組み
 
翔泳社『DBマガジン』2007年4月号
「XML&XML-DB徹底解剖」に掲載
 
伊奈正剛/西澤晶

昨今、各ベンダから続々とXML-DB製品がリリースされている。しかし、「XML-DBってどんな製品?」という疑問を持つ読者も多いのではないだろうか。本パートでは、このような読者のために、データベースの作成、XMLデータの登録/検索/更新などの基本操作や、XMLデータ問い合わせ言語「XQuery」について解説する。ぜひ、XML-DBの世界を体験してみてほしい。

STEP4 XMLデータを検索する

RDBに標準のクエリ言語SQLがあるのと同様に、XML-DBにも標準のクエリ言語XQueryがある。

XQueryが正式に標準になったのは最近であるが、ほとんどのXML-DB製品はXQueryのドラフト段階から準拠している。XQueryを使用することにより、階層構造を持つXMLデータから条件を指定してデータを取り出すことができる。RDBを扱うためにSQLが必須であるように、XML-DBを使う技術者にはXQueryの習得は必要不可欠だと言えよう。

XQueryの特徴は、XPathと呼ばれるXMLのノードを指定する表現式と、「FLWOR構文」と呼ばれる条件の表現式によってXMLデータを参照して結果を返す点にある。XPathは“/”を用いて階層中の要素の位置を指定するが、FLWOR構文は、“for”、“let”、“where”、“order by”、“return”を使って検索指示を行なう。

これらが実際にどのように使われるのかを以降で見てみよう。

条件を指定せずにXQueryを使う場合

LIST2は、STEP3で登録された1000件の週報データから「社員名」と「顧客名」をセットで取得するXQueryである。

LIST2:条件を指定しないXQuery

1:XQUERY
2:for $report in db2-fn:xmlcolumn("MYSCHEMA.WEEKLY_REPORT.REPORT")
3:return <社員別顧客名リスト>{$report/週報/社員/社員名,
                                         $report/週報/報告//顧客名}</社員別顧客名リスト>;

1行目の「XQUERY」は、以降にXQueryが続くことを示すキーワードであり、DB2 9でXQueryを使用する場合に必須となるものである。XQueryを記述する際は、アルファベットの大文字/小文字が区別される点がSQLと異なるので注意しよう。

2行目にある「for」はFLWOR構文の一部で、検索対象とするXMLデータを指定する。XQueryでは頭文字「$」で変数を表わすことになっており、この例では、変数「$report」は「in」以下で指定される週報のXMLデータを参照している。変数が参照するXMLデータの指定方法は、製品によって異なる。DB2 9では、独自の組み込み関数「db2-fn:xmlcolumn」を使用し、表スキーマ名/テーブル名/カラム名を指定することで参照するXMLデータを特定している。

3行目の「return」もFLWOR構文の一部で、処理の結果となるXMLを返却することを示すものだ。「return」に続いて現われる「社員別顧客名リスト」タグは元のXMLデータにはないものだが、このタグは処理結果の前後に付加される。こうすることで、XQueryでは結果セットのXMLデータを自由に加工できる。

続いて“{ }”で囲まれた中に「$report」から始まるXPath表現が2つ並んでいる。最初の「$report/週報/社員/社員名」は、「/週報/社員/社員名」の要素を指定している。XPathでは“//”で示されるワイルドカードが使用でき、2 つ目のように「$report/週報/報告//顧客名」と指定すれば、「/週報/報告」要素以下にあるすべての「顧客名」要素を指定できる。

この検索を実行した結果がLIST3だ。

LIST3:条件を指定しないXQueryの結果

<社員別顧客名リスト>
    <社員名>吉原剛</社員名>
    <顧客名>西本トレーディング</顧客名>
    <顧客名>大澤工業</顧客名>
</社員別顧客名リスト>
<社員別顧客名リスト>
    <社員名>石田純</社員名>
    <顧客名>西本トレーディング</顧客名>
</社員別顧客名リスト>
<社員別顧客名リスト>
   …

LIST2の「for」で指定された変数による参照は、指定されたXMLデータ全件に対して繰り返し行なわれる。この検索式を実行すると、

①「$report」が1000件の週報を繰り返し参照する
② それぞれの週報に対して「/週報/社員/社員名」の要素と「/週報/報告」要素以下にある「顧客名」要素を取得する

その結果、LIST3にある「社員別顧客名リスト」で囲まれた結果が得られるのである。

図1-Aには「/週報/報告/顧客名」、図1-Bには「/週報/報告/プロジェクト/顧客名」とあり、異なる位置に「顧客名」がある。LIST2のようにXPathのワイルドカードを利用してデータを指定することにより、この両方のデータを取り出していることに注意していただきたい。このようにXQueryを使えば、構造の違いを容易に吸収できるのである。

条件を指定してXQueryを使用する場合

続いて、検索の際に条件を指定する方法を見ていこう。

LIST4は、STEP3で登録したデータから、「西本トレーディング」という名の顧客についての報告を抜き出し、「社員名」と「問題点」を取得するXQueryである。

LIST4:条件を指定するXQuery

1:XQUERY
2:for $report in db2-fn:xmlcolumn("MYSCHEMA.WEEKLY_REPORT.REPORT")/週報/報告
3:let $dept := $report/../社員/部署名
4:let $name := $report/../社員/社員名
5:where $report//顧客名='西本トレーディング'
6:return <顧客別問題点>{$dept, $name, $report//問題点}</顧客別問題点> ;

1行目はLIST1と同様である。2行目もLIST1と同様に検索対象を指定しているが、ここではXPath「/週報/報告」で要素を指定しており、「$report」を使用することにより直接「報告」要素にアクセスしている。

3行目と4行目にある「let」はFLWOR構文の1 つで、変数にXMLデータへの参照を設定する。XPathの「..」は親要素を表わすが、「$report/..」は「報告」の親要素、「週報」を指す。この2行で「$dept」が「/週報/社員/部署名」を、「$name」が「/週報/社員/社員名」を参照している。

5行目の「where」はFLWOR構文のうち条件指定を行なうものである。「$report」が参照するXMLデータから、「顧客名」が「西本トレーディング」であるデータのみを結果セットに含めるよう絞り込んでいる。既述したように図1-Aと図1-Bでは「顧客名」の位置が異なっているが、XPathのワイルドカードを使用することで、構造の違いを吸収して検索条件を指定できるのである。

この検索を実行した結果をLIST5に示す。LIST4の6行目「return」以下の構文により条件指定で絞り込まれた結果セットから変数を使用して「部署名」「社員名」を取得し、XPathのワイルドカードを使用することにより「問題点」のデータを取得している。

LIST5:条件を指定するXQueryの結果

<顧客別問題点>
    <部署名>システム営業4課</部署名>
    <社員名>吉原剛</社員名>
    <問題点>販売管理システムの担当SEの対応が悪いとのクレーム有り。</問題点>
</顧客別問題点>
<顧客別問題点>
    <部署名>流通システム開発2課</部署名>
    <社員名>石田純</社員名>
    <問題点>
        2週間遅れで結合テストに入った。
        遅れを取り戻すには要員追加が必要な状況。
    </問題点>
    <問題点>
        販売部員から画面仕様が違っているとの指摘を受けた。
        仕様書通りである旨説明したが、納得していない模様
    </問題点>
</顧客別問題点>

なお、LIST4では使っていないが、“order by”を使用してソートキーとなる要素を指定することで、検索結果を並べ替えることもできる。

 

Page   | 1  | 2  | 3  | 4  |

このサイトについてプライバシーポリシーサイトマップ

お問合わせ

Copyright (C) 2000-2011 UL Systems, Inc. All Rights Reserved.