1. ホーム
  2. データベース
  3. デービーツー

XQueryによるDB2 XMLデータのクエリ

2022-01-22 13:03:26
私が見ているdb2チュートリアルは XQueryでDB2 XMLデータをクエリする」です。

XQueryについて
XQueryはSQLと多くの重要な点で異なりますが、その理由の大部分は、この2つの言語が異なる特性を持つ2つのデータモデル向けに設計されているためです。XML ドキュメントには階層的な構造があり、固有の順序があります。SQL ベースのデータベース管理システムがサポートする表形式のデータ構造は、フラットでコレクションベースであるため、行の間に順序はありません。
この2つのデータモデルの違いは、それぞれのクエリー言語の根本的な違いにつながります。例えば、XQueryはプログラマーがXML階層を移動できるようにパス式をサポートしていますが、純粋なSQL(XML拡張なし)はサポートしていません。XQueryは型付きデータと型無しデータの両方をサポートしますが、SQLデータは常に指定された型で定義されます。XMLドキュメントではデータの欠落や不明な点を無視するため、xQueryにはヌル値がありません。XQuery は XML データの範囲を返しますが、SQL は様々な SQL データ型の結果セットを返します。
これは、XQueryとSQLの基本的な違いのほんの一例です。網羅的なリストを提供することはこの記事の範囲外ですが、近日発売の IBM Systems Journal では、これらの言語の違いについてより詳細に説明する予定です。とりあえず、XQuery 言語の基本的な側面を探り、DB2 Viper で XML データをクエリするためにどのように使用できるかを見てみましょう。
サンプルデータベース
この記事のクエリーは、「"DB2 Viper Quick Start" (developerWorks, April 2006)」で作成したサンプルテーブルにアクセスするものです。リスト 1 は、サンプルデータベースの "items" と "clients" テーブルの定義を示したものです。
リスト1. テーブルの定義
テーブルitemsを作成します。
id int primary key not null,
ブランド名 varchar(30),
itemname varchar(30)。
sku int,
srp decimal(7,2),
コメント xml
)
テーブルclients() を作成します。
id int primary key not null,
name varchar(50)。
status varchar(10)。
連絡先情報 xml
)
図1は"items.comments"カラムに含まれるXMLデータの例、図2は"clients.contactinfo"カラムに含まれるXMLデータの例を示しています。以降のクエリ例では、これらのXML文書の一方または両方の特定の要素を参照することになります。
図1. items" テーブルの "comments" カラムに格納された XML ドキュメントのサンプル。

図2. clients" テーブルの "contactinfo" カラムに格納された XML ドキュメントのサンプル

クエリ環境
この記事にあるクエリはすべて対話式で発行されます。これは DB2 Control Center の DB2 Command Line Processor または DB2 Command Editor を使って行うことができます。本書の画面イメージや説明では、主に後者の方法を使用しています。(DB2 Viper には、プログラマーがグラフィカルにクエリを作成できる Eclipse ベースの Developer Workbench も付属しています。(アプリケーション開発の問題点や Developer Workbench については、ここでは触れません)。
DB2 コマンドエディタを使用するには、Control Center を起動し、Tools -> Command Editor を選択し、図 3 のウィンドウを表示します。上のパネルにクエリを入力し、左上の緑色の矢印をクリックしてクエリを実行すると、下のパネルまたはクエリ結果タブで出力を確認することができます。
図3. DB2 Control Center から起動できる DB2 コマンドエディタ

XQueryの例
DB2 XML データを SQL で照会する」 と同様に、この記事では、一般的なビジネスシナリオを説明し、XQuery を使用して XML データへの要求を満たす方法を紹介します。また、この記事では、XQuery に SQL を埋め込む必要がある、より複雑なシナリオについても説明します。
XQueryには、自由に組み合わせることができる様々なタイプの式が用意されています。各式は、他の式の入力として使用できる値のセットを返します。最も外側の式の結果が、クエリの結果となります。
この記事では、2 つの重要な XQuery 式、すなわち "FLWOR" 式と path 式を取り上げます。これは、複数の項目からなるリストを繰り返し処理するために使用され、オプションとして各項目で演算して得られた値を返します。パス式は、階層化されたXML要素間を移動し、パスの終点で見つかった要素を返します。
SQLのSELECT-FROM-WHERE式と同様に、XQueryのFLWOR式はキーワードで始まる複数の節を含むことができます。以下のキーワードは、FLWOR 式の句の先頭として使用されます。

  • forを使用します。入力シーケンスを繰り返し、各入力アイテムに順番に変数をバインドします。
  • let: 変数を宣言し、代入する(複数の項目を持つリストの場合もある)。
  • where: クエリ結果をフィルタリングするための条件を指定します。
  • order by: 結果のソート順を指定します。
  • return: 返される結果を定義します。
XQuery のパス式は、スラッシュで区切られた一連の "ステップ"で構成されています。最も単純な形式では、各ステップは XML 階層を下っていき、前のステップで返された要素の子要素を検出します。パス式の各ステップは、そのステップが返す要素をフィルタリングし、特定の条件を満たすものだけを残す述語を含むこともできます。たとえば、変数 $clients が <Client> 要素を含む XML ドキュメントのリストにバインドされていると仮定すると、4 段階のパス式 $clients/Client/Address[state = "CA"]/zip は、カリフォルニアに居住するクライアントの郵便番号を返すことになります。
多くの場合、FLWOR式やパス式を用いて、クエリを任意に記述することができる。
DB2 XQueryをトップレベルのクエリ言語として使用する
DB2 Viper で XQuery を (SQL 文に埋め込むのではなく) 直接実行するには、クエリの先頭にキーワード xquery を指定する必要があります。このキーワードは、DB2 の XQuery パーサを起動してリクエストを処理するように指示します。これは、XQuery を一番外側 (トップレベル) の言語として使用する場合のみ必要であることに注意してください。XQuery 式を SQL に埋め込んでいる場合は、文の前に xquery キーワードを付ける必要はありません。ただし、この記事では XQuery を基本言語として使用しているため、すべてのクエリの前に xquery を付けています。
XQueryをトップレベル言語として使用する場合、入力データのソースが必要です。XQueryが入力データを取得する方法の1つは、DB2テーブルのXMLカラムが存在するテーブル名とそのカラム名を示す1つの引数でdb2-fn:xmlcolumnという関数を呼ぶことです。db2-fn:xmlcolumn関数は与えられたテーブルに格納されているXMLドキュメントを返します。