DB基礎講座:XQueryとSQLはどう違う?
一気に分かる“XQuery”ハンズオン演習
日本アイ・ビー・エム米持幸寿
2006/7/6
XQueryの基本構文は、以下のようになります。
for $変数名 in 式
let $変数名 := 式
order by 式
where 式
return 式
すべてを書くわけではなく、省略しつつ組み合わせて記述していきます。
変数への代入と戻り値
対象となるXMLをFLOWR構文で扱うためには、変数に代入することと、戻り値を構成します。変数は「$」に文字列を足したもので表します。XQueryでは、関数が返してよこすXMLが複数にわたる場合、それを順番にイテレート(順次処理)します。forで変数に代入した関数の結果は、それぞれ変数に代入されてイテレートされるので、4つのXMLインスタンスが処理されるなら、変数の処理が4回、ループのように行われます。
for $input in db2-fn:xmlcolumn("DIR.INFO") |
リスト2 forによるイテレート処理 |
これはリスト1の関数のみを実行したときと同じ結果が返ります。
XPathによる出力の調整
次にXPathによって出力を調整してみましょう。4回出力されるXMLですが、それぞれのXML出力のうち、最初のディレクトリの最初のファイルのエレメントのみを出力させるようにreturn句にXPathを使って指定してみます。
for $input in db2-fn:xmlcolumn("DIR.INFO") |
リスト3 return句にXPathを使用する |
すると、リスト4のように3つの出力しか戻らなくなります(以下、出力結果の改行は調整してあります)。これは、4つのうち1つには「最初のdir要素の下の最初のfile要素」という条件が当てはまらなかったためです。
<file name="config.ini"> |
リスト4 リスト3の出力結果 |
では次により深いファイルをすべて探して、ファイルの大きさが10Mbytes以上のものをすべて表示してみましょう。
for $d in db2-fn:xmlcolumn("DIR.INFO") |
リスト5 出力の条件に「ファイルサイズ10Mbytes以上」を加えた |
このクエリを実行すると、リスト6の結果が出力され、Eclipseのディレクトリ内には10Mbytes以上のファイルが2個あることが確認できます。結果は一瞬で返ってきますので、ディレクトリ内の10Mbytes以上のファイルを探すよりはるかに早いことが実感できます。
<file name="doc.zip"> |
リスト6 リスト5の出力結果 |
このような抽出はXQueryというよりXPath式の処理によってなされています。ところで、この結果にはちょっと困ったことがあります。それはルート要素がないことです。これではこの結果をそのまま使うためにはルート要素を別途付けなければなりません。ルート要素を付けるためには、「{ }」で囲んだXQueryを発行してルート要素を付ける構文が使えます。
<result> |
リスト7 ルート要素を付け加える構文 |
これできれいなXMLが戻されました。
<result> |
リスト8 リスト7の出力結果 |
リスト8を見て「SOAPのEnvelopeとBodyを外側に付けるとWebサービスになるなぁ」と思ってしまいました。
where句とorder by句
次に条件を使った処理をして、ソートしてみましょう。forで変数に取り込む対象を、関数が返してよこすXMLの下にある「すべてのfile要素」と変更します。そして、lastModifiedが「2006/06/20 00:00:00」より大きなときにreturnが実行されるようにwhere句を追加します。このとき、ファイル名でソートしましょう。
<result> |
リスト9 where句とorder by句の使用 |
これによって、2006年6月20日以降に修正された6つのファイルのfile要素が戻されました。属性に付けられているnameでソートされています。
<result> |
リスト10 リスト9の出力結果 |
◇
さて、いかがでしょうか。XQueryの応用構文はほかにもたくさんありますが、今回はこれくらいにしておきます。XQueryを使って検索することで、XMLで保存されたツリー構造のデータが非常に柔軟に扱えることが分かっていただけたでしょうか?
3/3 |
Index | |
DB基礎講座:XQueryとSQLはどう違う? 一気に分かる“XQuery”ハンズオン演習 |
|
Page
1 ・はじめに ・XMLはどのように保存されるべきか ・SQLとXQueryは何が違うのか |
|
Page 2 ・XQueryの代表的な機能 |
|
Page 3 ・FLOWR構文を使ったXQuery演習 |
DB基礎講座:XQueryとSQLはどう違う? |
- Oracleライセンス「SE2」検証 CPUスレッド数制限はどんな仕組みで制御されるのか (2017/7/26)
データベース管理システムの運用でトラブルが発生したらどうするか。DBサポートスペシャリストが現場目線の解決Tipsをお届けします。今回は、Oracle SE2の「CPUスレッド数制限」がどんな仕組みで行われるのかを検証します - ドメイン参加後、SQL Serverが起動しなくなった (2017/7/24)
本連載では、「SQL Server」で発生するトラブルを「どんな方法で」「どのように」解決していくか、正しい対処のためのノウハウを紹介します。今回は、「ドメイン参加後にSQL Serverが起動しなくなった場合の対処方法」を解説します - さらに高度なSQL実行計画の取得」のために理解しておくべきこと (2017/7/21)
日本オラクルのデータベーススペシャリストが「DBAがすぐ実践できる即効テクニック」を紹介する本連載。今回は「より高度なSQL実行計画を取得するために、理解しておいてほしいこと」を解説します - データベースセキュリティが「各種ガイドライン」に記載され始めている事実 (2017/7/20)
本連載では、「データベースセキュリティに必要な対策」を学び、DBMSでの「具体的な実装方法」や「Tips」などを紹介していきます。今回は、「各種ガイドラインが示すコンプライアンス要件に、データベースのセキュリティはどのように記載されているのか」を解説します
|
|