XMLテクノロジ

XMLをネイティブでリレーショナルにする

Jonathan Gennick著

Oracle XML DBは、ネイティブ・フォーマットを提供し、リレーショナル・データベース・アクセスを可能にします。

XMLは、ビジネス間のデータ交換に最適な言語として急速に採用されつつあります。しかし、多くのビジネスでは、Oracle9i Databaseなどのリレーショナル・データベースにデータを格納しています。その場合、階層的なドキュメント中心のXMLの世界と表を用いた 集合指向のリレーショナル・データベースの世界の隔たりをどのように埋めればよいのでしょうか。XML文書をファイル・システムのファイルとして格納するのでしょうか。XML文書を解体して、データをリレーショナルに格納するのでしょうか。こうした2つのアプローチから選択するとすれば、データの使用方法に基づくトレードオフを行う必要があります。しかし、選択する必要がないとすればどうでしょうか。同時のアプローチをいっせいに行えるとしたらどうでしょうか。Oracle XML DB RepositoryというOracle9i Database Release 2の新機能がこのことを可能にします。

リポジトリとは

Oracle XML DBは、インストールが必要な別の製品でも別のオプションでもありません。Oracle XML DBは、Oracle9i Database Release 2に直接構築されたXML機能とテクノロジのコレクションです。その主要な機能が、Oracle XML DB Repositoryです。このリポジトリを使用することにより、XML文書を直接Oracle9i Database Release 2に格納することができます。XML文書をリポジトリ内に格納すると、XML中心あるいはリレーショナル中心の方法でXMLデータにアクセスできるようになります。

XMLデータのデータベースへの格納は、FTP、HTTPまたはWebDAV(すべて業界標準プロトコル)を使用してXML文書ファイルを記述するだけで充分です。データベースからXMLデータを取り出すにはSQL問合せを実行する、またはこれらの同プロトコルのいずれかを使用してファイルを読み込むだけで簡単に行えます。

本書での設定について

本書では例として、ユーザーが独立したアーティストによって製作されたCDのマーケティングのビジネスを行っていると想定します。主要なミュージック・ストア・チェーン、オンライン・サイトおよびアーティスト自身との情報交換が必要となります。CDのコンテンツを記述するために、 リスト1 に示すようなXML文書形式を作成し、Oracle XML DB Repositoryを利用してその情報をデータベースに格納 したいと考えているとします。また、SQLからデータへのアクセスおよびネイティブXML文書へ容易にアクセスしたいと考えているとします。すなわち、データをリレーショナルおよび階層的に アクセスしたいと考えているとします。このアーティクルでは、自分がDBAであると想定してそれを行います。

XMLスキーマの登録

まず、Oracle XML DB RepositoryにXMLスキーマを登録します。XMLスキーマを登録すると、Oracle XML DB Repositoryではそのスキーマを保持することが可能なオブジェクト型およびオブジェクト表が作成されます。SQL*Plusから実行する次のDBMS_XMLSCHEMA.registerURIのコールは、http://gennick.com/cd.xsdからリスト2に示すXMLスキーマを検索して登録します。

BEGIN
   DBMS_XMLSCHEMA.registerURI(
      'cd.xsd',
      'http://gennick.com/cd.xsd');
END;
/

注意: スキーマを登録してこのアーティクルに記載する例を作成するには、あらゆるスキーマ・オブジェクト型のためのCREATE権限に加え、ALTER SESSIONおよびQUERY REWRITE権限が必要です。

リスト3に、CDスキーマを登録した結果、作成された構造およびオブジェクトの一部を示します。XMLスキーマのインスタンスを保持するために、CD331_TABという名前のXMLType表が作成されました。リポジトリ内の各CDのXML文書は、表の中では1行で表されます。そのようなXMLType表のリストは、 USER_XML_TABLES データ・ディクショナリ・ビューに問い合わせることで検索できます。ここではXMLスキーマの登録前後にビューに問い合わせ、新規の表の名前を検索しました。 CD331_TABにある各行には、XMLスキーマに対応するよう作成されたCD327_Tオブジェクト型の1つのインスタンスが含まれます。XML文書の最上位層のフィールドは CD327_Tオブジェクト型の属性として表され、属性名はXMLフィールド名と一致します。たとえば、オブジェクト型のTitleフィールドは、XML SchemaのTitle要素に直接対応します。SongsフィールドはSongs要素に対応します。Songsは、XML Schemaの複合要素であり、"Songs328_T"という別のオブジェクト型にマッピングされています。SQL*Plusコマンドで DESCRIBE "Songs328_T" を実行し、続いてSongsフィールドの定義にドリルダウンした場合、Songsのコレクションは最終的に各要素が1つのSongを表したVARRAYとして実装されます。

XMLスキーマを登録すると、Oracle9 i Database Release 2で生成されるオブジェクトおよび型の名前を制御できます。また、XMLデータを格納するために使用する特定のデータ型も制御できます。これは、Oracle XML DB Repositoryで定義された属性および oraxdb名前空間の一部を使用してXML Schemaの注釈を付けることによって行います。ユーザーによってこれらの属性が提供されない場合はOracle9i Database Release 2によって自動的に生成されます。リポジトリ内に格納されたXMLスキーマのバージョンを見ることによりOracle9i Database Release 2で作成された属性を容易に参照できます。図1 にどのように簡単にリポジトリ・データにアクセスできるかを示します。ここでは標準のWebブラウザを使用してHTTP経由でアクセスしています。図1 はリポジトリ内のCDスキーマの一部を示しています。XMLスキーマの注釈はすべて"oraxdb"からはじまります。URLはリポジトリで使用されているデフォルトHTTPポートのポート8080を参照 していることに注意してください。

デフォルトではXMLスキーマを登録した際に作成されたすべてのオブジェクトは、XMLスキーマを登録したユーザーによって所有されます。ここでは、 リスト3 およびCDスキーマの表と型および関連するその他すべての型を所有することになります。XMLスキーマが登録されているので、CDスキーマのインスタンスであるいずれかのXMLファイルをリポジトリに保存すると、それは細断され、CD331_TAB表に格納されます。XMLスキーマ の登録処理は、ユーザー固有のものです。他のユーザーによって保存されたCDファイルは、XMLスキーマを登録したユーザーの表には格納されません。オプション・パラメータの DBMS_XMLSCHEMA.registerSchema を使用してすべてのユーザーに影響するグローバル・スキーマを作成し、どのユーザーも表にCD文書を保存できるように設定するオプションもあります。

フォルダの作成

CDのXML文書をOracle XML DB Repositoryに格納するには、それらを保存するフォルダが必要です。フォルダを作成するには、SYSTEMユーザーとしてログインし、リスト4にあるPL/SQLブロックを実行します。 DBMS_XDB.createFolder へコールすると、/CDというトップ・レベル・フォルダが作成されます。次にPL/SQLブロッ クは、 DBMS_XDB.setAcl プロシージャを使用して所有者( SYSTEM )にすべてのフォルダ権限と他のすべてのユーザーに読取り権限を付与するACL(Acess Control List)を作成します。次に、フォルダの所有者を SYSTEM から GENNICK に変更するために、リポジトリの RESOURCE_VIEW に対して UPDATE 文を発行します。フォルダの作成後にコミットすることが重要です。これを行うまで他のセッションでは参照できません。これでFTPまたはWebDAVを使用して GENNICKユーザーとして接続し、/CDフォルダにXMLファイルを格納できます。

XML文書の保存

XMLスキーマを登録し、XML文書を格納するフォルダが作成されると、リポジトリへの文書の保存はファイルのコピーのように容易に行えます。リスト5 に、 リスト1 に示すファイルLegendsOfTheGreatLakes.xmlをリポジトリにコピーするFTPセッションを示します。 FTP open コマンドで使用されたポート2100は、FTPセッションでリポジトリによって使用されるデフォルトのポートです。FTPを使用する代わりに、WebDAVおよびWindows Webフォルダを使用してWindowsでのコピーおよび ペースト操作を使用しても容易に行えます。

RESOURCE_VIEWの使用

RESOURCE_VIEW という名前のビューは、重要なビューです。 RESOURCE_VIEW は、アクセス権のあるリポジトリ内の各文書またはフォルダに対して1行を返します。たとえば次の問合せを実行することにより、/CDフォルダにあるすべてのXML文書のリストを取得できます。

SELECT any_path
FROM resource_view
WHERE under_path(res,'/CD')=1
AND extractValue(res,
'/Resource/ContentType')='text/xml';

ANY_PATH
-------------------------------
/CD/Gospel/NothingLess.xml
/CD/LegendsOfTheGreatLakes.xml

上記の UNDER_PATH ファンクションを使用すると、与えられたリポジトリ・リソースが指定したフォルダ(またはパス)のいずれかの場所に存在するかをテストできます。この場合 には、機能を使用すると問合せの結果は/CDフォルダおよびそのサブフォルダ内のリソースに限定されます。 RESOURCE_VIEW に対するパスベースの問合せは、関連する表に作成される階層ドメイン索引によって効率化されています。この索引はリポジトリの一部なので作成する必要はありません。

XMLサンプルCDスキーマ
図1: Oracle XML DB RepositoryのサンプルCDスキーマの一部

リソース・ビューの RES列はリソース自体ではなくリソースのメタデータのみを表します。RES列に新しく extractValue ファンクションを適用すると、各リソースのコンテンツ・タイプを調べます。その結果、問合せ結果はさらにXML文書を指すパスのみに制限されます。'/Resource/ContentType'構文はXPath表記法を表します。XPathは、XML文書の部分を指定する標準の表記法で、XMLデータに対する問合せで頻繁に使用します。

リポジトリのパスがわかる場合には、新しい XDBUriType オブジェクト型を使用することにより、 該当するXML文書のすべてまたは一部を検索できます。リスト6に2つの問合せを示します。最初の問合せは、上記の拡張機能であり、 XDBUriType を使用して/CDフォルダの下のすべてのXML文書を取得します。 リスト6 の2つ目の問合せは、CDタイトルのみを抽出するためにURLの最後に標準XPath構文を追加します。
さらに詳しく知るには

Oracle9i ドキュメントhttp://technet.oracle.co.jp/document/
にある『Oracle9i XMLデータベース開発者ガイド - Oracle XML DB リリース2 (9.2)』を参照してください。

他のOracle9i XMLのドキュメント:
http://technet.oracle.co.jp/tech/xml/xmldb/

Oracle9 i XMLについて学習するには
http://education.oracle.com/web_prod-plq-dad/plsql/show_desc.redirect?redir_type=10
にて、最新のOracle XML関連のクラスのリストを参照してください。

リポジトリ・データへのリレーショナル・アクセス

関連する表へ直接移動することでリポジトリ内のXMLデータにアクセスすることも可能です。CDスキーマを登録した際に作成した関連する表は、 CD331_TABです。この表に対して直接問合せを記述することが可能ですが、それらの問合せがXMLに対応している必要があります。リレーショナル・データで使用するために設計されたレポート・ツールからのXMLデータのアクセスを容易にするために、 リスト7 に示すようなビューを作成します。 リスト7 ではビューに加え、アーティスト名の索引も作成します。ビューおよび索引を使用することにより、次のような標準のリレーショナル問合せを効率的に実行できます。

SELECT title
FROM cd_master
WHERE artist='Carl Behrend';

XMLデータの更新

cd_master ビューのすべての列は、SQL関数に基づくため、残念ながらビューを更新することはできません。しかしリポジトリ内のXMLデータの更新は、次のようにスキーマが登録されたときに作成された表を更新するだけで行えます。

UPDATE CD331_TAB cd
SET VALUE(cd) = updateXML(
  value(cd),
  '/CD/Website/text()',
  'http://greatlakeslegends.com/legends.htm'
);

新しい updateXML関数でのXPath構文の使用に注目してください。パス'/CD/Website/text()'は、CD文書のWebsiteフィールドのテキストの更新を指定します。 updateXML の3番目の引数は、テキストの新規の値を指定します。これはインプレース更新なので非常に効率的です。Oracle XML DB Repositoryで変更されるXML全体を再構築する必要はありません。XMLスキーマが登録されているので、Oracle XML DB Repositoryではこの問合せを基盤となるオブジェクト構造のWebsite属性のみが変更されるように書き直すことができます。

まとめ

Oracle XML DB Repositoryでは、データベースにXML文書を格納し、標準のインターネット・プロトコルを使用してそれらの文書にアクセスすることが可能です。また標準のリレーショナルの問合せを使用して、そのXML文書またはその一部にアクセスすることも可能です。XMLデータとリレーショナル・データではなく、単純にデータを保持するということになります。"XML"と"リレーショナル"は単にデータを参照する方法の異なるパラダイムです。パラダイムからデータを分離させることにより、Oracle9i では重要な資産の1つであるデータをパラダイムの変更から守ることができます。

Jonathan Gennickは、習熟したOracle DBAであり、Oracle Certified Professionalです。現在ライターとして活躍しており、近著には『Oracle SQL*Plus Pocket Reference, Second Edition』(O'Reilly & Associates, 2002)があります。

 
Copyright © 2003, Oracle Corporation Japan. All rights reserved. Contact UsLegal Notices and Terms of UsePrivacy Statement
This page is managed and cached by Oracle9i
Oracle Corporation発行の「Make XML Native and Relative」の翻訳版です。