DB2® Viperリリース(現在はベータ版)では、XMLデータの格納、管理、検索の新しいサポートを大きな特長としています。基本タスクの実行方法を説明するステップ形式の記事を通して、これらの新しいXML機能について簡単にマスターしましょう。ここでは、XMLデータを管理するためのデータベース・オブジェクトの作成方法と、DB2データベースにXMLデータを取り込む方法について学習します。

Cynthia M. Saracco, Senior Software Engineer, IBM

Cynthia M. Saraccoは、IBM Silicon Valley Lab. のシニア・ソフトウェア・エンジニアです。彼女は、データベース管理、オブジェクト指向プログラミング、およびWebテクノロジーに関連したテクノロジーについて、これまでに2冊の書籍と40以上の記事を執筆しています。加えて、南北アメリカ、ヨーロッパ、および中東において、これらの論題に関する講義を行っています。



2006年 3月 02日

DB2の新しいViperリリースについて聞いたことのある方もいるでしょう。これは、テーブル形式(SQLベース)と階層形式(XMLベース)のデータ構造の両方をサポートする、IBM初のデータベース管理システムです。このドキュメントは、DB2の新しいXML「ネイティブ」サポートをいち早く知りたい方には必見です。

DB2のネイティブXML機能を簡単に理解できるように、次の一般的なタスクを挙げて説明します。

  1. テスト・データベース、サンプル・テーブル、ビューなど、XMLデータを管理するためのデータベース・オブジェクトを作成する。
  2. INSERTステートメントとIMPORTステートメントを使って、データベースにXMLデータを取り込む。
  3. XMLデータを検証する。XMLスキーマを作成してDB2に登録したら、データのインポート時にXMLVALIDATEオプションを使用します。

今後の記事では、SQLを使ったDB2 XMLデータの照会、更新、削除、XQueryを使ったDB2 XMLデータの照会、DB2 XMLデータにアクセスするJavaアプリケーションやWebコンポーネントの作成などのトピックを扱う予定です。

データベース・オブジェクトの作成

まずは単体のDB2 Unicodeデータベースを作成しましょう。DB2 Viperでは、XMLドキュメントと従来形式のSQLデータ(整数、日付/時刻、可変長文字列など)の両方を格納できるのはUnicodeデータベースしかありません。後でこのデータベース内で、XMLと他のデータ型の両方を管理するためのオブジェクトを作成します。

テスト・データベースの作成

新しいDB2 Unicodeの「test」データベースを作成するには、DB2コマンド・ウィンドウを開き、Unicodeコードセットとサポート対象地域を指定するステートメントを発行します。リスト1に例を示します。

リスト1.XMLデータを格納するデータベースの作成
create database test using codeset UTF-8 territory us

Unicodeデータベースの作成後は、特別なコマンドを発行したり、さらに操作を行ったりしなくても、ネイティブの階層形式でDB2にXMLデータを格納できるため、DB2システムをすぐに使い始めることができます。

サンプル・テーブルの作成

XMLデータを格納するには、1つ以上のXML列が含まれたテーブルを作成します。これらのテーブルはドキュメント・コレクションの論理コンテナとして機能します。DB2の内部では、実際にはXMLデータと非XMLデータに対して異なる格納スキームを使用しています。ただし、特にさまざまな形式のデータを1つのクエリに統合する必要がある場合は、すべての形式のサポート対象データを管理する1つの論理オブジェクトとしてテーブルを使用することで、管理とアプリケーション開発の問題が簡素化されます。

DB2テーブルの定義では、XML列のみを含めるか、従来のSQL型の列のみを含めるか、または両方を組み合わせることができます。ここでは後者をモデルにします。リスト2の例では、「test」データベースに接続して2つのテーブルを作成します。1つ目の「items」テーブルは、販売品目についての情報と、顧客が販売品目について作成したコメントを追跡します。2つ目の「clients」テーブルは、連絡先データなどクライアントに関する情報を追跡します。「comments」と「contactinfo」は新しいDB2 XMLデータ型に基づいていますが、テーブル内のそれ以外の列はすべて従来のSQLデータ型に基づいています。

リスト2.XMLデータ用のテーブルの作成
connect to test;

create table items (
  id          int primary key not null, 
  brandname   varchar(30), 
  itemname    varchar(30), 
  sku         int, 
  srp         decimal(7,2), 
  comments    xml
);

create table clients(
  id          int primary key not null, 
  name        varchar(50), 
  status      varchar(10), 
  contactinfo xml
);

これらのテーブルの定義例を良く見ると、どちらも「comments」列または「contactinfo」列に格納されるXMLドキュメントの内部構造を指定していないことに気付くでしょう。これは重要なDB2機能です。ユーザーはXMLデータ構造(より正確に言えばXMLスキーマ)を事前に定義しなくてもデータを格納できます。確かにDB2では、整形式のXMLドキュメントを1つの列に格納することができます。つまり、異なるスキーマを持つXMLドキュメント(登録されたスキーマと関連付けられていないドキュメント)を同じDB2列に格納することが可能です。この機能については、DB2へのデータの格納方法を説明する際に詳しく扱います。

ビューの作成

従来のSQLデータ型のみを含むテーブルに対してビューを作成できるように、XMLデータを含むテーブルに対しても任意でビューを作成できます。リスト3の例では、statusが「Gold」のクライアントを表示するビューを作成します。

リスト3.XMLデータを含むビューの作成
create view goldview as 
select id, name, contactinfo 
from clients where status='Gold';

インデックスに関する注意

最後に、XML列に対して特殊なインデックスを作成することでデータ検索を高速化できる点に注意してください。この記事は入門編でサンプル・データも小さいので、ここではこのトピックについては扱いません。ただし実動環境では、最適なパフォーマンスを実現するうえで適切なインデックスを定義することが不可欠です。DB2の新しいインデックス・テクノロジーの詳細については、後述の「参考文献」を参照してください。


XMLデータの格納

テーブルを作成したら、そのテーブルにデータを取り込むことができます。これを行うには、SQLのINSERTステートメントを直接発行するか、DB2のIMPORTファシリティーを呼び出して内部的にINSERTステートメントを発行します。

INSERTステートメントの使用

INSERTでは、DB2に生のXMLデータを直接追加します。アプリケーションを作成し、XMLデータを変数で格納している場合は、おそらくこの方法が最も簡単です。ただし、DB2 Viperにまだ不慣れでアプリケーションを作成したくない場合は、INSERTステートメントを対話式で発行することも可能です(コマンド・ライン・プロセッサーを使用しても構いませんが、DB2 Command Editorを使用すると便利でしょう)。

DB2 Command Editorを使用するには、DB2 Control Centerを起動します。最上部にある「Tools」プルダウン・メニューから「Command Editor」を選択すると、図1のような個別のウィンドウが表示されます。

図1.DB2 Command Editor

上のペインに次のステートメントを入力します。

リスト4.対話式のXMLデータの挿入
connect to test;

insert into clients values (77, 'John Smith', 'Gold', 
   xmlparse(document '<addr>111 Main St., Dallas, TX, 00112</addr>' 
   preserve whitespace)  
)

左端にある緑色の矢印をクリックすると、このコマンドが実行されます。

(リスト1に示すように)XMLデータを1行で指定するには、XMLPARSE関数を呼び出してドキュメントを文字値からXML型の値に変換する必要があります。この例の場合、入力されるドキュメントは非常に単純です。ドキュメントが大きいか複雑な場合は、例示のようにXMLデータをINSERTステートメントに入力しない方が良いでしょう。一般には、ホスト変数またはパラメーター・マーカーを使ってデータを挿入するアプリケーションを作成する場合がほとんどです。この記事には簡単なJavaコーディング例も付属していますが、これは入門編のチュートリアルなので、アプリケーション作成のトピックについては詳しく説明しません。ここでは代わりに別の方法、つまりIMPORTファシリティーを使ってDB2 XML列にデータを取り込む方法について説明します。

DB2 IMPORTの使用

XMLデータがすでにファイルになっている場合は、DB2 IMPORTファシリティーを使ってこのデータをDB2テーブルに簡単に取り込むことができます。アプリケーションを作成する必要はなく、テーブルにロードしたいデータが含まれた区切りASCIIファイルを作成するだけで済みます。ファイルに格納されたXMLデータの場合、パラメーターで適切なファイル名を指定します。

区切りASCIIファイルは、任意のテキスト・エディターを使って作成できます(規則により、このようなファイルは一般に拡張子が.delになります)。ファイル内の各行は、テーブルにインポートされる1行のデータを表します。行にXMLデータ指定子(XDS)が含まれている場合、IMPORTは参照先XMLファイルに含まれているデータを読み取り、それをDB2にインポートします。たとえば、図2の1行目にはElla Kimptonに関する情報(ID、名前、顧客ステータスなど)が含まれています。この顧客の連絡先情報はClient3227.xmlファイルに含まれています。

図2.DB2 IMPORTへの入力用の区切りASCIIファイルの例

図3に、Client3227. xmlファイルの内容を示します。おわかりのように、このファイルにはElla Kimptonの住所、電話番号、ファックス番号、電子メール・アドレスについてのXML要素が含まれています。

図3.クライアントXMLファイルの例

挿入したいすべての行に対してXMLファイルが揃っていない場合のデータのインポート方法については、おそらく皆さん関心があることでしょう。これを行うのは簡単です。入力ファイルからXDS情報を削除してください。たとえば、図4のitems.delファイルの場合、品目3641(「Dress to Impress」スーツ)のXMLファイル名が削除されています。この結果、この行のXML列にはデータがなくなります。

図4.1つの行にXMLデータ指定子がない場合の区切りASCIIファイルの例

XMLファイルと区切りASCIIファイルが揃ったら、DB2 IMPORTをいつでも使用できます。リスト4に示す次のステートメントは、C:/XMLFILESディレクトリー内のclients.delファイルで指定された内容を「clients」テーブルにインポートします。

リスト4.「clients」テーブルへのデータのインポート
import from clients.del of del xml from C:/XMLFILES insert into user1.clients;

図2に示すclients. delファイルには、6つのXMLファイルを指す参照を含め、6行分のデータが含まれています。IMPORTコマンドを正しく実行すると、図5のような出力が表示されます。

図5.DB2 IMPORTの出力例

Exegenixのように、WordやPDFなどのドキュメント形式をDB2にインポート可能なXML形式に変換できるツールを提供している独立系ソフトウェア・ベンダーもあります。(Exegenixの詳細については「参考文献」を参照してください。)


XMLデータの検証

先ほど説明したINSERTとIMPORTの例では、整形式のXMLデータがテーブルに書き込まれます。このデータの検証は行われません。つまり、データが特定のXMLスキーマと特定の構造に従っているかどうかは検証されません。ただし、検証を行うようDB2に命令することは可能です。次に、この実行方法の1つについて説明します。

ステップ1: XMLスキーマの作成

XMLデータを検証するには、XMLスキーマを定義して、受け入れられるXML要素とそれらの順序、データ型などを指定する必要があります。XMLスキーマはW3C業界標準であり、XMLで記述されます。この記事では、このXMLスキーマの特長については説明しませんが、Web上ではさまざまなチュートリアルが提供されています(「参考文献」を参照)。

XMLスキーマの作成方法としては、任意のテキスト・エディターを使ってスキーマを手作業で作成する方法から、ツールを使ってグラフィック形式でスキーマを設計または生成する方法まで多数あります。MDXSYS Limitedのように、この種のXMLツールを提供している独立系ソフトウェア・ベンダーもあります。また、IBMでもJava™統合開発環境を通してXMLスキーマ生成のサポートを提供しています。

たとえばIBM WebSphere® Studioでは、図3に示すClient3227.xmlファイルをWebプロジェクトにインポートできます。マウスで右クリックし、「Generate」->「XML Schema」を選択すると、特定の入力ファイル用の有効なXMLスキーマが生成されます(図6を参照)。この後、必要に応じてファイルを修正し、DB2に登録することができます。

図6.WebSphere Studioを使ってXMLファイルからXMLスキーマを生成

XMLスキーマをさらに柔軟なものにして、異なる顧客ごとに異なる種類の連絡先情報を収集できるようにしたいとします。たとえば、複数の電話番号や電子メール・アドレスを提供する顧客もいれば、そうでない顧客もいます。

図7に示すXMLスキーマは、WebSphere Studioによって生成されたスキーマから派生したものです。このスキーマを使用すると柔軟性が向上します。これには、所定の要素に対して許容されるオカレンスの最小数と最大数(「minOccurs」と「maxOccurs」)に関する追加指定が含まれています。この場合、顧客は連絡先情報を何も提供しなくても構いません。ただし顧客が電子メール情報の提供を選択した場合は、このスキーマにより、適切なドキュメントに最大5つの電子メール・アドレス(つまり5つの「email」要素値)を指定できるようになります。

図7.クライアントの連絡先情報のXMLスキーマ例

すでにお気付きかもしれませんが、XMLスキーマには型情報も含まれています。図7に示すスキーマは単にすべての基本要素が文字列として扱われるよう指定されていますが、実動XMLスキーマのほとんどは、他のデータ型(整数、小数、日付など)も利用しています。INSERTまたはIMPORTの操作の一部として、XMLドキュメントを所定のスキーマと照合して検証する場合は、DB2により型の注釈が自動的にXMLドキュメントに追加されます。

ステップ2: XMLスキーマの登録

適切なXMLスキーマを作成したら、そのスキーマをDB2に登録する必要があります。IBMではこの実行方法をいくつか提供しています。DB2 Control Centerからグラフィカル・ウィザードを起動しガイドに従ってプロセスを実行する方法、システム提供のストアド・プロシージャーを呼び出す方法、またはDB2コマンドを直接発行する方法があります。ここでは、DB2がユーザーに代わって内部で何をしているかが良くわかるように、後者の方法を使いましょう。

スキーマがかなり大きい場合は、登録する前に必要に応じてアプリケーション・ヒープ・サイズを増やしてください。たとえば、次のステートメントを発行します。

リスト4.アプリケーション・ヒープ・サイズの増加
 connect to test;
 update db cfg using applheapsz 10000;

次に、XMLスキーマを登録します。XMLスキーマが他のXMLスキーマを参照しない場合は、1つのコマンドで登録し、このプロセスを完了することができます。それ以外の場合は、1次XMLスキーマを登録し、それ以外の必須スキーマを追加し、登録プロセスを完了するのに、個々のコマンドを発行する必要があります。スキーマ・ドキュメントがかなり大きくなる場合は、保守性、可読性、再利用性を高めるためにドキュメントの内容を複数のファイルに分割するのが一般的です。これは、複雑なアプリケーションやコンポーネントを複数のモジュールに分割することと似ています。このトピックの詳細については、W3Cの「XML Schema primer」を参照してください(「参考文献」を参照)。

ここでは、単純な独立型のXMLスキーマを使用します。このスキーマをDB2に登録するには、次のコマンドを使用します。

リスト5.XMLスキーマの登録
register xmlschema 'http://mysample.org' from 'C:/XMLFiles/ClientInfo.xsd' as 
user1.mysample complete;

この例では、ClientInfo.xsdがXMLスキーマ・ファイルの名前です。このファイルはC:/XMLFilesディレクトリーにあります。このXMLスキーマはDB2の内部リポジトリーで、SQLスキーマ「user1」とXMLスキーマ「mysample」の下に登録されます。http://mysample.orgパラメーターは、この例では単なるプレースホルダーです。これは、XMLインスタンス・ドキュメントによって参照されるURI(Uniform Resource Indicator)を指定します。多くのXMLドキュメントで使われている名前空間は、URIを使って指定されます。最後に、「complete」節によって、XMLスキーマ登録プロセスを完了するようDB2に命令が出され、このスキーマがXMLデータの検証に使用できるようになります。

スキーマ登録プロセスには、そのスキーマが適用されるテーブル列の指定は含まれないことに注意してください。つまり、スキーマはSQLの列制約と同等ではありません。1つのスキーマで、異なるテーブル内にあるさまざまなXML列のデータを検証できますが、検証は自動ではありません。DB2では、整形式のXMLドキュメントをXML列に格納することが可能です。格納前に登録済みスキーマと照合してデータを検証したい場合は、それを実行するようDB2に命令する必要があります。

ステップ3: 検証を伴うXMLデータのインポート

XMLデータをテーブルに挿入またはインポートするときには、DB2で作成された登録済みのXMLスキーマを使って、DB2でXMLデータを検証することができます。スキーマ検証を念頭に置きながら、始めの方で触れたIMPORTのシナリオを再確認しましょう。

「clients」テーブルにすでにデータを取り込んでいる場合は、その内容を削除するか、テーブルをドロップして作成し直す方が良いかもしれません。これが必要になるのは、以前に追加したのと同じデータをテーブルに追加する場合のみです。「clients」はクライアントID列の主キーで定義されているため、重複した行をインポートしようとすると失敗します。

「clients」テーブルにインポートする際にXMLデータを検証するには、DB2 IMPORTのXMLVALIDATE節を使用します。次のリスト6のステートメントは、前に登録したXMLスキーマ(user1.mysample)をデフォルトのXDS (XMLデータ指定子)として使って、「clients」テーブルに挿入する前にclients.delファイルで指定されたXMLファイルを検証するようDB2に命令します。

リスト6.検証を伴うXMLデータのインポート
import from clients.del of del xml from C:/XMLFILES xmlvalidate using xds default  
user1.mysample insert into user1.clients;

XMLドキュメントが指定されたスキーマに従っていないとDB2が判断した場合は、そのドキュメントと関連付けられている行全体が拒否されます。図8に示すIMPORT操作からの出力例では、6つの行のうち1つが拒否されています。これは、その行のXMLドキュメントが指定されたスキーマに従っていなかったためです。

図 8.DB2 IMPORTからの出力例(1つの行が拒否された状態)

XMLVALIDATEをINSERTステートメントとともに使用して、XMLデータを挿入する前に検証するようDB2に命令することもできる点に注意してください。この構文は、XMLVALIDATE節の呼び出し時に登録済み(および完了済み)のXMLスキーマを指定する点で、先に示したIMPORTの例と似ています。(詳細については、「A simple Java example」を参照してください。)


まとめ

DB2 Viperには、新しいXMLデータ型や、XMLデータを効率的な方法で自動的に格納および処理する基本的なエンジン・レベルのコンポーネントなど、XMLをサポートするための重要な新機能が用意されています。これらの機能を簡単に理解できるように、ここではXMLドキュメントを格納するためのテスト・データベースとサンプル・テーブルの作成方法について説明しました。また、データベースにXMLデータを取り込む方法についても確認しました。最後に、ユーザー指定のXMLスキーマと照合してXMLデータを検証するDB2機能について概説し、これを使い始める方法の例を示しました。

DB2の新しい「ネイティブ」XML機能を使ってXMLデータを格納する方法を習得できたので、今度はこのデータを照会することができます。この方法については今後の記事で、DB2の新しいXQueryのサポートや、SQLを対象としたXMLの拡張(「SQL/XML」とも呼ばれます)について紹介する際に説明します。

謝辞

この記事を作成するにあたって、Rav Ahuja氏、Matthias Nicola氏、Gary Robinson氏より貴重なご意見を賜り深く感謝致しております。


ダウンロード

内容ファイル名サイズ
Sample codesamples.zip  ( HTTP | FTP )4KB

参考文献

学ぶために

製品や技術を入手するために

  • 皆さんの次期開発プロジェクトを、IBM trial softwareを使って構築してください。developerWorksから直接ダウンロードすることができます。

議論するために

  • developerWorks blogsに参加して、developerWorksコミュニティーに加わってください。

コメント

developerWorks: サイン・イン

必須フィールドは(*)で示されます。


IBM ID が必要ですか?
IBM IDをお忘れですか?


パスワードをお忘れですか?
パスワードの変更

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


お客様が developerWorks に初めてサインインすると、お客様のプロフィールが作成されます。会社名を非表示とする選択を行わない限り、プロフィール内の情報(名前、国/地域や会社名)は公開され、投稿するコンテンツと一緒に表示されますが、いつでもこれらの情報を更新できます。

送信されたすべての情報は安全です。

ディスプレイ・ネームを選択してください



developerWorks に初めてサインインするとプロフィールが作成されますので、その際にディスプレイ・ネームを選択する必要があります。ディスプレイ・ネームは、お客様が developerWorks に投稿するコンテンツと一緒に表示されます。

ディスプレイ・ネームは、3文字から31文字の範囲で指定し、かつ developerWorks コミュニティーでユニークである必要があります。また、プライバシー上の理由でお客様の電子メール・アドレスは使用しないでください。

必須フィールドは(*)で示されます。

3文字から31文字の範囲で指定し

「送信する」をクリックすることにより、お客様は developerWorks のご使用条件に同意したことになります。 ご使用条件を読む

 


送信されたすべての情報は安全です。


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=60
Zone=Information Management, XML
ArticleID=270027
ArticleTitle=DB2 Viperの紹介
publish-date=03022006