プライマリ・コンテンツに移動
Oracle® XML DB開発者ガイド
12cリリース1 (12.1)
B71282-04
目次へ移動
目次
索引へ移動
索引

前
次

21 Oracle XML DBリポジトリ・データへのアクセス

Oracle XML DBリポジトリ・データにアクセスして操作するには、FTPやHTTP(S)/WebDAVなどの標準プロトコルを使用する、Oracle XML DB Resource Application Program Interface (API)を使用する、リポジトリ・ビューRESOURCE_VIEWPATH_VIEWを使用するなどのいくつかの方法があります。

21.1 Oracle XML DBリポジトリの概要

Oracle XML DBリポジトリを使用すると、従来のリレーショナル・データベース構造ではなく、階層構造のデータベースにコンテンツを格納できます。このリポジトリでは、あらゆる種類のコンテンツを管理できますが、XMLコンテンツを持つリソースの管理に関連する特別な機能と最適化機能が用意されています。

従来、リレーショナル・データベースは、階層構造の管理や、パスまたはURLの検索には適していません。Oracle XML DBリポジトリを使用すると、データベース内のXMLコンテンツを階層構造に整理できます。ファイルやフォルダを使用して整理した場合と同様の問合せおよび管理が可能になります。

リレーショナル表/行/列隠喩は、高度に構造化されたデータの管理に効果的なモデルです。ドキュメント指向のXMLデータなど、半構造化されたデータまたは構造化されていないデータの管理には、あまり効果的ではない可能性があります。

たとえば、1冊の本を表の一連の行として表すのは容易ではありません。本は冊-章-節-段落のような階層として表すのが一般的で、その階層は一連のフォルダおよびサブフォルダとして表すことができます。

階層リポジトリ索引によって、フォルダとパスの検索が高速化されます。Oracle XML DBには、特許を取得した階層索引が含まれており、この階層索引によってOracle XML DBリポジトリ内のフォルダとパスの検索が高速化されます。階層リポジトリ索引はエンド・ユーザーに対して透過的で、Oracle XML DBでは、従来のファイル・システムと同等以上の速度でフォルダとパスの検索を実行できます。

図21-1に、典型的なツリーとして表示されるOracle XML DBリポジトリのフォルダおよびファイルの階層構造の例を示します。ツリーの上部は、ルート・フォルダ(/)です。

図21-1 リポジトリの階層構造を示すフォルダ・ツリー

図21-1の説明が続きます
「図21-1 リポジトリの階層構造を示すフォルダ・ツリー」の説明

注意:

フォルダ/sysは、Oracle XML DBによって、システム定義のXML Schemaやアクセス制御リスト(ACL)などをメンテナンスするために使用されます。フォルダ/sysのデータを変更したり追加したりしないでください。

Oracle XML DBリポジトリ内の内容には、SQL、PL/SQL、Java、Cの各言語に加えて、FTP、HTTP(S)、WebDAVなど標準の接続アクセス・プロトコルを使用してアプリケーションからアクセスできます。Oracle XML DBでは、文書中心の操作のために設計されたこれらのプロトコルに対するネイティブ・サポートがOracle Databaseに追加されます。これらのプロトコルをサポートすることにより、Oracle XML DBでは、Microsoft Windows Explorer、Microsoft Office、およびAltovaやAdobeなどのベンダーからの製品が、リポジトリに格納されたXMLコンテンツを直接操作できます。

リポジトリを使用すると、ファイル・システムに格納されているかのように、Oracle Databaseに格納されているXMLコンテンツに直接アクセスできます。リポジトリのファイルおよびフォルダに対するアクセス制御権限を設定できます。

こうした機能を使用できるのは、HTTPプロトコルに対する一連の拡張機能を定義しているIETF標準であるWebDAV上でリポジトリがモデル化されているためです。WebDAVによりHTTPサーバーはDAV対応クライアントに対するファイル・サーバーとして機能できます。たとえば、WebDAV対応エディタは、HTTP/WebDAVサーバーがファイル・システムであるかのように対話できます。

DAV標準では、ファイルやフォルダを示すためにリソースという用語が使用されます。WebDAVサーバーにより管理される各リソースは、URLで識別されます。リソースには、コンテンツの他に関連のメタデータがあります。

次のトピックでは、標準プロトコルを使用して、Oracle XML DBリポジトリ・フォルダのデータにアクセスする方法について説明します。Java、SQLおよびPL/SQLを使用してリポジトリ・オブジェクト階層にアクセスするために使用できるAPIについて説明します。

21.1.1 Oracle XML DBで提供される名前レベル・ロック

Oracle XML DBリポジトリの主要なメリットの1つは、論理トランザクションでのリポジトリ操作でSQLを使用できることです。アプリケーションによって、複数のフォルダの更新を含む、実行時間の長いトランザクションが作成される場合があります。このリポジトリでは、高いレベルの同時実行性を実現するために、フォルダ・レベル・ロックではなく名前レベル・ロックを使用します

リレーショナル・データベースを使用して階層フォルダ構造を保持する場合、フォルダに対して項目を追加または削除するときに高度な同時実行性を保証することは重要な問題です。従来のファイル・システムでは、トランザクションの概念はありません。各操作(ファイルの追加、サブフォルダの作成、ファイル名の変更、ファイルの削除など)は、基本トランザクションとして処理されます。操作が完了すると、ファイル・システムのすべてのユーザーに対して変更がすぐに反映されます。

この場合、更新されたフォルダまたはディレクトリ・ツリーに排他ロックを設定する従来のロック方針では、同時実行性に関する重大な問題がすぐに発生します。Oracle XML DBでは、フォルダ・レベル・ロックではなく名前レベル・ロックを提供して、これを解決します。サブフォルダまたはファイルの作成、名前の変更、移動、削除などのリポジトリ操作では、ターゲット・フォルダに対する排他書込みロックの付与は必要はありません。リポジトリは、フォルダ自体ではなくフォルダ内の名前をロックして、フォルダに対する同時操作を管理します。名前および変更タイプは、キューに入れられます。

トランザクションがコミットされた場合にのみ、フォルダがロックされてそのコンテンツが変更されます。したがって、Oracle XML DBでは、1つのフォルダのコンテンツに対して複数のアプリケーションが同時に更新を実行できます。また、キューを使用すると、2つのアプリケーションによる同じ名前のオブジェクトの作成を回避できるため、フォルダの同時実行性を管理できます。

同じトランザクションで1つのフォルダに対して複数の変更が行われる場合は、コミット時までフォルダの変更をキューに入れて、I/Oを最小限にすることもできます。これは、短時間の間に複数のアプリケーションが同じディレクトリ内にファイルを生成する場合に役立ちます。たとえば、トレース・ファイルやログ・ファイルを生成する場合、印刷または電子メール配信用にスプール・ディレクトリを保持する場合などです。

注意:

データベースによって適用されるトランザクション・セマンティクスの結果として、SQL文を使用して作成されたフォルダは、トランザクションがコミットされるまで他のデータベース・ユーザーから参照されません。Oracle XML DBリポジトリへの同時アクセスは、Oracle Databaseの同時実行性の制御に使用されるのと同じメカニズムを使用して制御されます。リポジトリのOracle Databaseとの統合により、XMLコンテンツに対する強力な管理オプションが提供されます。

21.1.2 Oracle XML DBリポジトリ・リソースにアクセスする2つの方法

Oracle XML DBリポジトリ・リソースにアクセスして操作するには、特別なビューでSQLを使用するか、階層索引を使用してパスにナビゲートします。

  • SQLアクセス。リソースのプロパティおよびパス名を公開し、階層アクセス演算子をOracle XML DB Schemaへマップする特別のビューを使用することにより行います。「リポジトリ・リソースへの問合せベースのアクセス」を参照してください。

  • ナビゲーションベースまたはパスベースのアクセス。リソースの階層索引が使用されます。各リソースは、階層内の場所を反映する、1つ以上の一意のパス名を持ちます。XPath式を使用して、任意のリポジトリ・リソースへナビゲートできます。

    リポジトリ・リソースは、データベース内の既存のXMLTypeオブジェクトへの参照として作成できます。このようなデータベース・オブジェクトには、XPathを使用してナビゲートできます。「リポジトリ・リソースへのナビゲーショナル・アクセスまたはパス・アクセス」を参照してください。

関連項目:

Uniform Resource Locator(URL)を使用して、Oracle XML DBリソースにアクセスできます。URLには、オブジェクトのホスト名、プロトコル情報、パス名およびリソース名が含まれます。

21.1.3 データベース・スキーマ(ユーザー・アカウント) XDBおよびOracle XML DBリポジトリ

データベース・スキーマ(ユーザー・アカウント) XDBXMLTypeXDB$RESOURCEを所有し、これには、Oracle XML DBリポジトリ内のすべてのリソース(ファイルおよびフォルダ)が含まれます。また、リポジトリを管理するためのすべてのメタデータも含まれます。

データベース・スキーマXDBは、Oracle XML DBのインストール中に作成されます。このスキーマのプライマリ表はXDB$RESOURCEというXMLType表で、これには、Oracle XML DBリポジトリ内のリソース(ファイルまたはフォルダ)ごとに1行が含まれます。この表内の文書はリソース・ドキュメントと呼ばれます。Oracle XML DBのリソース・ドキュメントの構造を定義するXML Schemaは、URL http://xmlns.oracle.com/xdb/XDBResource.xsdに登録されています。

データベース・スキーマ(ユーザー)XDBが所有する表は内部です。次が推奨されます。

  • ユーザーXDB (およびOracle XML DBリポジトリ)のみが使用する専用の表領域を作成します。表領域が読取り専用でないことを確認してください。

  • ユーザーXDBが所有する表またはデータを直接操作することはできません。たとえば、それらを圧縮または圧縮解除しないでください。

    XDBが所有する表またはデータを操作するには、Oracle XML DBが提供しているPL/SQLサブプログラムおよびデータベース・ビューのみを使用します。

  • どのような場合でも、ユーザーXDB絶対にロック解除しないでください

関連項目:

  • ユーザーXDBおよびリポジトリ専用の表領域の作成の詳細は、「パッケージDBMS_XDB_ADMIN」を参照してください。

  • データベース・スキーマXDBの詳細は、『Oracle Database 2日でセキュリティ・ガイド』を参照してください。

21.2 リポジトリの用語と提供されているリソース

Oracle XML DBリポジトリは、ファイルではなくデータベース・オブジェクトのファイル・システムとして考えることができます。これは、すべてのXML Schemaおよびデータベース・スキーマをまたぐ、階層化された一連のデータベース・オブジェクトです。これらのデータベース・オブジェクトはパス名にマップされます。

このリポジトリは、単一のルート・ノード(/)を持つ、連結された有向非循環脚注1グラフです。図式内の各リソースは、関連付けられた1つ以上のパス名を持ちます。リポジトリは、指定されたリソースへの複数のリンクをサポートします。

21.2.1 リポジトリの用語

Oracle XML DBリポジトリで使用される用語には、リソース、リソース名、リソース・コンテンツ、フォルダまたはディレクトリ、パス名、パス要素、リンク名、アクセス制御リスト(ACL)およびXDBBinary要素があります。これらの用語の一部には、他のコンテキストでの共通の同義語が存在します。

  • リソース: リポジトリ階層内のオブジェクトまたはノード。リソースは、オブジェクトのパス名とリソース名を含むUniform Resource Locator (URL)によって識別されます。

  • フォルダ: 他のリソースを含むことができるリソース。ディレクトリと呼ばれることもあります。

  • パス名: リソースへの絶対パスを表す階層形式の名前。リポジトリのルートを表すスラッシュ(/)と、それに続くスラッシュで区切られたゼロ個以上のパス要素で構成されています。「.」または「..」のみをパス要素とできませんが、それ以外の形であれば、ピリオド(.)をパス要素で使用できます。パス要素は、データベース・キャラクタ・セットの任意の文字で構成されますが、スラッシュ(/)およびバックスラッシュ(\)の他、構成パラメータ/xdbconfig/sysconfig/invalid-pathname-charsを使用したOracle XML DBの構成ファイル/xdbconfig.xmlに指定された文字は除きます

  • リソース名(またはリンク名) - その親フォルダ内のリソースの名前。この名前が、パス名の中で最も右端のパス要素となります。リソース名は、それらを直接含むフォルダ内で一意である必要があり、大/小文字は区別されます。

  • リソース・コンテンツ: リソースの本体、つまりデータ。これは、リソースをファイルとして処理してそのコンテンツを要求したときに取得されるものです。型は常にXMLTypeです。

  • アクセス制御リスト (ACL) - プリンシパル(ユーザーまたはロール)に対するアクセス権限を1つ以上のリポジトリ・リソースに指定する、順序付けられたルールのリスト。

  • XDBBinary要素: バイナリデータを含むXML要素。Oracle XML DB XML Schemaで定義されています。XDBBinary要素は、非構造化バイナリ・データがOracle XML DBにアップロードされたときに、リポジトリに格納されます。

表21-1に示すとおり、Oracle XML DBで使用される多くの用語には、他のコンテキストでの共通の同義語が存在します。

表21-1 Oracle XML DBリポジトリの用語の同義語

同義語 リポジトリの用語 用途

コレクション

フォルダ

WebDAV

ディレクトリ

フォルダ

オペレーティング・システム

権限

権限

権限

権利

権限

様々

WebDAVフォルダ

フォルダ

Webフォルダ

ロール

グループ

アクセス制御

リリース

バージョン

RCS、CVS

ファイル・システム

リポジトリ

オペレーティング・システム

階層

リポジトリ

様々

ファイル

リソース

オペレーティング・システム

バインド

リンク

WebDAV

21.2.2 事前定義されたリポジトリのファイルおよびフォルダ

Oracle XML DBリポジトリでは、特定のファイルおよびフォルダが事前定義されています。独自に使用するために追加のものを作成できます。

事前定義されたOracle XML DBリポジトリのファイルおよびフォルダを次に示します。

/dbfsFoot 2
/public
/sys
/sys/acls
/sys/acls/all_all_acl.xml
/sys/acls/all_owner_acl.xml
/sys/acls/bootstrap_acl.xml
/sys/acls/ro_all_acl.xml
/sys/apps
/sys/asm
/sys/log
/sys/schemas
/sys/schemas/PUBLIC
/sys/schemas/PUBLIC/www.w3.org
/sys/schemas/PUBLIC/www.w3.org/2001
/sys/schemas/PUBLIC/www.w3.org/2001/xml.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/XDBResource.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/XDBSchema.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/XDBStandard.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/acl.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/dav.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/log
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/stats.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/xdbconfig.xsd
/xdbconfig.xml

21.3 Oracle XML DBリポジトリ・リソース

Oracle XML DBリポジトリ・リソースは、XMLスキーマXDBResource.xsdに準拠します。リソースの要素には、作成日、変更日、WebDAVロック、所有者、ACL、言語、キャラクタ・セットなどのWebDAV定義のプロパティを永続的に格納するために必要な要素が含まれます。

リソース索引には、リソースのコンテンツを含む、Contentsという特別な要素が含まれます。

リソースのXML Schemaでは、maxOccurs属性が無制限のany要素も定義します。any要素は、Oracle XML DBのXML名前空間外のすべての要素を含むことができます。任意のインスタンス定義のプロパティをリソースと関連付けることができます。

21.3.1 リポジトリ・データが格納される場所

Oracle XML DBは、Oracle XML DBリポジトリのデータを、アクセス可能な一連の表および索引に格納します。

XML Schemaを登録し、Oracle XML DBによって表が生成されるように要求した場合、表はユーザーのデータベース・スキーマに作成されます。このため、それらを参照または変更することができます。他のユーザーは、表を参照する権限を付与されないかぎり、その表を参照できません。

21.3.1.1 生成された表の名前

生成された表の名前は、Oracle XML DBによって割り当てられます。これらは、ユーザーのXML Schema文書(またはデフォルトのXML Schema文書)のxdb:defaultTable属性を検索することによって取得できます。

XML Schemaを登録する場合、Oracle XML DBによって作成されたデフォルト名でなく、ユーザー独自の表名を指定することもできます。表でXML記憶域が指定されている場合、文書はXML形式にエンコードされてから表内に格納されます。

21.3.1.2 リポジトリ・リソース用のオブジェクト・リレーショナル記憶域の定義方法

リポジトリ・リソース用のオブジェクト・リレーショナル記憶域を定義するには、登録済のXML Schemaに準拠するデータをサブクラス化するか、格納します。

リポジトリ・リソース用のオブジェクト・リレーショナル記憶域を定義する必要があるアプリケーションでは、次のいずれかの方法で行います。

  • Oracle XML DBリソース・タイプをサブクラス化します。Oracle XML DBリソースのサブクラス化には、XDB$RESOURCE表に対する権限が必要です。

  • 参照可能な登録済XML Schemaに準拠するデータを格納します。

21.3.1.3 Oracle ASM仮想フォルダ

Oracle Automatic Storage Management (Oracle ASM)の仮想フォルダ/sys/asmのコンテンツは、Oracle ASMにより自動管理されるOracle ASMファイルおよびフォルダです。

21.3.2 Oracle XML DBリポジトリへの文書の格納方法

登録されたXML Schemaに基づくXML文書がリポジトリにロードされると、文書が解析され、スキーマに従って一連のSQLオブジェクトに分解されます。ソースXML文書にリポジトリ・アクセスを提供するために、対応するリソース・ドキュメントが作成されます。

Oracle XML DBでは、XML文書を特別な方法で処理します。XML Schemaに基づくXML文書のコンテンツを格納するルールは、そのXML Schemaで定義されます。文書のコンテンツは、グローバル要素定義に関連付けられたデフォルト表に格納されます。

Oracle XML DBリポジトリには、JPEGイメージやWord文書など、XMLデータを含まないファイルも格納されます。各リソースのXML Schemaでは、使用可能な要素を定義し、ファイルのコンテンツをBLOBインスタンスとして格納するか、またはCLOBインスタンスとして格納するかを指定します。XML Schemaに基づかないXML文書のコンテンツは、CLOBインスタンスとしてリポジトリに格納されます。

リポジトリ内のファイルまたはフォルダごとに、1つのリソースおよび1つのリンク・プロパティ文書が存在します。指定したドキュメントへのアクセス・パスが複数存在する場合は、リンクごとにリンク・プロパティ文書が存在します。リソース・ドキュメントおよびリンク・プロパティ文書は、両方ともXML文書として格納されます。これらの文書はすべてリポジトリ内の表に格納されます。

XMLファイルをリポジトリにロードすると、次の順序でイベントが発生します。

  1. Oracle XML DBは、XML文書のルート要素を調べ、既知(登録済)のXML Schemaに関連付けられているかどうかを確認します。このとき、文書にXMLSchema-instance名前空間の名前空間宣言が含まれているかどうかが確認され、文書に関連付けられたXML Schemaを識別するschemaLocation属性またはnoNamespaceSchemaLocation属性が検索されます。

  2. 文書が既知のXML Schemaに基づいている場合は、XML SchemaのメタデータがXML Schemaのキャッシュからロードされます。

  3. XML文書は解析され、XML Schemaから導出された一連のSQLオブジェクトに分解されます。

  4. XMLファイルから作成されたSQLオブジェクトは、XML Schemaがデータベースに登録されたときに定義されたデフォルト表に格納されます。

  5. リソース・ドキュメントは、処理された文書ごとに作成されます。これによって、リポジトリを使用して、文書のコンテンツにアクセスできます。XML Schemaに基づくXMLTypeインスタンスのリソース・ドキュメントには、XMLRef要素が含まれています。この要素には、リソースに関連付けられたコンテンツが含まれるデフォルト表内の行を検索するときに使用できるXMLTypeREFが含まれます。

21.3.3 リポジトリ・データ・アクセス制御

アクセス制御エントリ(ACE)で構成されるアクセス制御リスト(ACL)を使用すると、Oracle XML DBリポジトリ内のリソースへのアクセスを制御できます。ACEは、特定のプリンシパルに対する一連の権限を付与または拒否します。

プリンシパルとは、データベース・ユーザー、データベース・ロール、LDAPユーザー、LDAPグループ、またはリソースの所有者である特別なプリンシパルDAV::ownerです。リポジトリ内の各リソースは、ACLによって保護されます。ACLによって、ユーザーがリソースに対して持つ権限(read-propertiesupdateなど)が決まります。各リポジトリ操作には、現行ユーザーがその操作の実行を許可されているかどうかを判断するために、ACLの確認が含まれています。

デフォルトでは、新規のリソースはその親フォルダのACLを継承します。ただし、PL/SQLプロシージャDBMS_XDB_REPOS.setACLを使用してリソースのACLを設定することもできます。Oracle XML DBのリソースのセキュリティの詳細は、 リポジトリのアクセス制御を参照してください。

次の例で、現行ユーザーはQUINEです。問合せでは、フォルダ/publicのリソースの数が戻されます。このフォルダには、f1f2の2つのリソースのみが存在すると想定します。また、f1のACLではread-properties権限がQUINEに付与されますが、f2のACLではQUINEに付与される権限はないと想定します。ユーザーがリソースを参照するには、そのリソースに対するread-properties権限が必要です。QUINEf1のみ参照できるため、問合せの結果は1です。

SELECT count(*) FROM RESOURCE_VIEW r WHERE under_path(r.res, '/public') = 1;
 
COUNT(*)
--------
       1

21.3.4 リポジトリのパス名の解決

フォルダをそのフォルダの内容に関連付けるデータは、Oracle XML DBの階層リポジトリ索引によって管理されます。これによって、オペレーティング・システムのファイル・システムで使用されるディレクトリ・メカニズムと同様に、パス名を評価するための高速なメカニズムが提供されます。パス名を解決するには、特定の権限が必要です。

フォルダであるリソースでは、要素ResourceのContainer属性がtrueに設定されます。

フォルダ内のリソース名を解決するには、現行のユーザーに次の権限が必要です。

  • フォルダに対するresolve権限

  • フォルダのリソースに対するread-properties権限

ユーザーがこれらの権限を所有していない場合、access deniedエラーが発生します。そのリソースに対するread-properties権限が拒否されている場合、フォルダのリストおよびその他の問合せによって行は戻されません。

注意:

パス名の解決におけるエラー処理では、ファイル・システムとの互換性に対して、無効なリソース名とフォルダでないリソースが区別されます。Oracle XML DBリソースは、SQLを使用してOracle XML DBリポジトリの外部からアクセスできるため、リソースを含むフォルダの読取りアクセスを制限しても、そのリソースへの読取りアクセスは制限されません

関連項目:

「XDBResource.xsd: Oracle XML DBリソースのためのXML Schema」(要素Resourceおよびその属性Containerの定義用)

21.3.5 リンク・タイプ

Oracle XML DBにおけるリンクは、リポジトリ・リンクまたはドキュメント・リンクのいずれかです。リポジトリ・リンクには、ハード・リンクおよび弱いリンクがあります。ドキュメント・リンクについても、それらのターゲットがリポジトリ・リソースの場合は、ハード・リンクおよび弱いリンクがあります。

21.3.5.1 リポジトリ・リンクとドキュメント・リンク

リソースの他に、フォルダ・リソースは他のリソース(ファイルまたはフォルダ)へのリンクも含むことができます。これらのリポジトリ・リンクは、リポジトリの階層関係を表しています。一方、ドキュメント・リンクはXML文書間の任意のリンクで、必ずしもリポジトリ・リソースではありません。

リポジトリ・リンクは、フォルダ・リンクと呼ばれることもあります。これは、ドキュメント・リンクとは異なり、XLink標準およびXInclude標準で提供されるリンクに相当し、Oracle XML DBでもサポートされます。リポジトリ・リンクは、フォルダと子の間をナビゲートするためのリポジトリ・リソース間のリンクです。ドキュメント・リンクは、リポジトリ・リソースとは限らないドキュメント間の任意のリンクです。

リポジトリ・リンクは、リポジトリの階層関係を表しています。一方ドキュメント・リンクは、それらを使用するアプリケーションによりセマンティクスが派生する任意の関係を表しています。リポジトリ・リンクは、リポジトリの階層関係を表しているため、ファイル・システムに関連するプロトコルを使用してナビゲートできます。ドキュメント・リンクではこのようなことはできません。ドキュメント・リンクは、任意の関係を表すことができるため、リポジトリの関係も表すことが可能です。このようにリソースをターゲットとしているドキュメント・リンクはさらに、ハード・リンクおよび弱いリンクに分けることができます。

関連項目:

ドキュメント・リンクの詳細は、Oracle XML DBでのXLinkおよびXIncludeの使用方法を参照してください。

21.3.5.2 ハード・リンクおよび弱いリンク

リポジトリ・リソースをターゲットとするリンクには、ハード・リンクと弱いリンクがあります。ハード・リンクと弱いリンクでは、ターゲットとしているリソースに関する依存関係が異なります。ハード・リンクは、祖先のフォルダをターゲットにできませんが、弱いリンクはできます。リポジトリ・リンク・タイプを判断するためにリポジトリ・パス・ビューPATH_VIEWに問い合せることができます。

ハード・リンクおよび弱いリンクはともに、物理データへの参照(またはポインタ)であり、(内部的な)リポジトリ・リソースの識別子です。他のリンクのシンボリック名やパスを指すものではありません。これらのターゲットは、リンクが作成される時点で解決されます。ハード・リンクおよび弱いリンクは、リソースの識別子を直接指すので、ターゲットは必ず必要です。そのかわり、ターゲットの移動や名前の変更が行われても、有効性は保持されます。ハード・リンクおよび弱いリンクの作成や削除には、同じ権限が必要です。

ハード・リンクと弱いリンクの違いは、ターゲット・リソースの削除に関連するものです。ターゲット・リソースは、ハード・リンクに対して従属関係にあります。つまり、ハード・リンクのターゲットである間は削除できません。ハード・リンクを削除すると、次のいずれも成り立つ場合、リンクのターゲットであるリソースも削除されます。

  • リソースがバージョニングされていません。

  • 削除するハード・リンクがそのリソースに対する最後の(したがって唯一の)ハード・リンクです。

弱いリンクには、リソースに対するこうした拘束力はありません。つまり、弱いリンクのターゲットであるリソースは(ハード・リンクのターゲットでないかぎり)削除できます。このため弱いリンクは、アクセスの頻度が高いリソースへのショートカットとして使用でき、それらのリソースの削除に影響しません。

ただし、弱いリンクには逆方向の依存性があります。弱いリンク(1つ以上)のターゲットになっているリソースを削除すると、それらの弱いリンクも自動的に削除されます。この意味でも、弱いリンクは参照先を失います。ハード・リンクおよび弱いリンクはいずれも、参照整合性を伴っています。つまり、リンクが存在すれば、そのターゲットも存在します。

ハード・リンクおよび弱いリンクには、この他にも違いがあります。祖先のフォルダへのハード・リンクは、循環を導入するため、許可されません。弱いリンクにはこのような制約はありません。弱いリンクは任意のフォルダをターゲットとでき、場合によっては循環が作成されます。Oracle XML DBリポジトリの(非環式)構造は、一連のハード・リンクによって定義されます。弱いリンクが表しているのは、その基本構造の上に追加されたマッピングです。

リポジトリ・リンク・タイプを判断するためにリポジトリ・パス・ビューPATH_VIEWに問合せを行うことができます。リンク・タイプはリンク情報に含まれています。ルート要素LINKの子要素LinkTypeに含まれるこの情報は、PATH_VIEWXMLTypeLINKに表示されます。例21-1に、これを示します。また、イベント・ハンドラ(LinkInLinkToUnlinkIn、またはUnlinkFrom)でコールバックgetLink()を使用して、リポジトリ・リンク・タイプを判断できます。

関連項目:

例21-1 PATH_VIEWへの問合せによるリンク・タイプの判断

SELECT RESID, XMLCast(XMLQuery('/LINK/LinkType' PASSING LINK RETURNING CONTENT)
                      AS VARCHAR2(24)) link_type
  FROM PATH_VIEW WHERE equals_path(RES, '/home/QUINE/purchaseOrder.xml') = 1;

RESID                              LINK_TYPE
--------------------------------   ---------
DF9856CF2FE0829EE030578CCE0639C5   Weak

21.3.5.3 フォルダ階層の情報がない状況での弱いリンクの作成

弱いリンクは、ハード・リンクによって決定されるリポジトリ構造の上のマッピングを表しています。リソースへの弱いリンクは、そのパスではなくOIDを使用して作成できます。弱いリンクを使用すると、リソースを含むフォルダにアクセスせずにリソースにアクセスできます。

ある同僚が所有しているファイル・リソースを閲覧するとします。そのリソースにアクセスしそれを閲覧できるようにする場合、そのファイルの祖先のフォルダすべてに関して権限<xdb:resolve>が付与されていないかぎり、そのリソースへのハード・リンクの作成はできません。この権限が付与されていれば、その同僚が所有するフォルダの名前、およびそのターゲット・リソースまでの階層構造をすべて知ることができます。

ただし、弱いリンクは基本的に、一連のハード・リンクによって定義されている実際のリポジトリ構造の上に追加されたマッピングを表しているため、リソースに対して、そのOIDを使用すれば、完全な名前のパス(URL)がなくても弱いリンクを作成できます。つまり、同僚が決めたファイルへのOIDパスを名前のパスのかわりに受け取れば、そのOIDパスを使用してドキュメントへの弱いリンクを作成できます。例21-2および例21-3に、これを示します。

例21-2は、ファイル・リソース/home/QUINE/purchaseOrder.xmlのOIDパスを出力したものです。ユーザーquineはこれを使用してリソースへのOIDパスを取得し、そのパスをユーザーcurryへ送信できます。またユーザーcurryは、リソースへの弱いリンクを作成できます(例21-3)。

例21-3では、ユーザーcurryが、quinePurchaseOrder.xmlという名前の弱いリンクをフォルダ/home/CURRY内に作成します。リンクのターゲットは、URL /home/QUINE/purchaseOrder.xmlに対応するOIDパスです。ユーザーcurryは、ユーザーquineには参照可能なリポジトリの構造を認識する必要はありません。

例21-2 リソースのOIDパスの取得

DECLARE
  resoid  RAW(16);
  oidpath VARCHAR2(100);
BEGIN
  SELECT RESID INTO resoid FROM RESOURCE_VIEW
    WHERE equals_path(RES, '/home/QUINE/purchaseOrder.xml') = 1;
    oidpath := DBMS_XDB_REPOS.createOIDPath(resoid);
  DBMS_OUTPUT.put_line(oidpath);
END;

例21-3 OIDパスを使用した弱いリンクの作成

CALL DBMS_XDB_REPOS.link(/sys/oid/1BDCB46477B59C20E040578CCE0623D3
                         '/home/CURRY', 'quinePurchaseOrder.xml',
                         DBMS_XDB_REPOS.LINK_TYPE_WEAK);

21.3.5.4 複数のハード・リンクを回避する方法およびタイミング

ハード・リンクの作成を制限し、フォルダまたはファイル(またはその両方)への複数のハード・リンクを許可しないようにできます。ファイル・リソースへの複数のハード・リンクを許可し、フォルダ・リソースへの複数のハード・リンクを許可しないことで、UNIXやLinuxなどのファイル・システムに近い動作を実現できます。

これにより、事実上、各ファイル・リソースに対して正規のハード・リンクのパスが一意に作成され、アプリケーションの設計を単純化できます。さらに、リソースに対して複数のハード・リンクを作成しないことで、問合せのパフォーマンスを向上できます。

構成ファイルxdbconfig.xmlで次のブール型パラメータを使用して、複数のハード・リンクの作成を回避するよう構成できます。各パラメータのデフォルト値はtrueで、複数のハード・リンクを作成できます。

  • folder-hard-links - falseの場合、フォルダ・リソースへの複数のハード・リンクの作成を回避します。

  • non-folder-hard-links - falseの場合、ファイル・リソースへの複数のハード・リンクの作成を回避します。

21.4 リポジトリ・リソースへのナビゲーショナル・アクセスまたはパス・アクセス

Oracle XML DBリポジトリのフォルダは、多くのオペレーティング・システムにより使用されている標準的なプロトコルをサポートしています。これによって、リポジトリ・フォルダは、サポートされているオペレーティング・システム環境で、ネイティブ・フォルダ(ディレクトリ)と同様に機能します。

次に例を示します。

  • 図21-2のように、ファイル・システムで他のファイルやフォルダにアクセスするときと同じように、Windows Explorerを使用してリポジトリのファイルおよびフォルダ(リソース)を開き、それにアクセスすることができます。

  • 図21-3および図21-4に示すように、WebブラウザからHTTP(S)/WebDAVを使用してリポジトリ・データにアクセスします。

    図21-3は、URL http://xdbdemo:8080/にアクセスしたときのブラウザを示しています。接続先のサーバーがxdbdemo、HTTPポート番号が8080です。

    図21-4は、データベースに格納されているXML文書(XSLスタイルシート)にHTTPを使用してアクセスしたときのブラウザを示しています。URLはhttp://localhost:8080/home/SCOTT/poSource/xsl/purchaseOrder.xslです。

図21-2 WindowsエクスプローラでのOracle XML DBのフォルダ

図21-2の説明が続きます
「図21-2 WindowsエクスプローラでのOracle XML DBのフォルダ」の説明

図21-3 HTTPやWebDAVおよびWebブラウザを使用したリポジトリ・データへのアクセス

図21-3の説明が続きます
「図21-3 HTTPやWebDAVおよびWebブラウザを使用したリポジトリ・データへのアクセス」の説明

図21-4 HTTPとURLを使用したパスベースのアクセス

図21-4の説明が続きます
「図21-4 HTTPとURLを使用したパスベースのアクセス」の説明

21.4.1 インターネット・プロトコルを使用したOracle XML DBリソースへのアクセス

Oracle Net Servicesでは、データベース・リソースのアクセス方法が提供されます。インターネット・プロトコルをサポートしているOracle XML DBでは、データベース・リソースにアクセスする別の方法が提供されます。

21.4.1.1 Oracle XML DBのプロトコル・アクセスを使用できる場所

Oracle Net Servicesは、レコード指向のデータに対して最適化されています。インターネット・プロトコルは、バイナリ・ファイルやXMLテキスト・ドキュメントなどのストリーム指向のデータ用に設計されています。特定のシナリオでは、Net ServicesよりOracle XML DBのプロトコル・アクセスを使用することをお薦めします。

  • ファイル・システムのようなデータベースを使用した、ファイル指向アプリケーションからデータベースへの直接アクセス

  • 均一なデータ・アクセス方法(MS SQL Server、Exchange、Notes、多くのXMLデータベース、株価情報サービス、ニュース配信を含む多くのデータ・サーバーによってサポートされているHTTPを介したXMLなど)を必要とする異機種間アプリケーション・サーバー環境

  • XMLテキスト形式のデータを必要とするアプリケーション・サーバー環境

  • 多くのアプリケーション処理を必要とせずに、クライアント側のXSLを使用して、データグラムをフォーマットするWebアプリケーション

  • データベース内で実行するJavaサーブレットを使用するWebアプリケーション

  • XML指向のストアド・プロシージャに対するWebアクセス

21.4.1.2 Oracle XML DBへのプロトコル・アクセスの概要

Oracle XML DBへのプロトコル・アクセスには、接続、ユーザー認証、リクエスト解析およびJavaサーブレットの起動が含まれます。

プロトコルを使用したOracle XML DBリソースへのアクセスは次のように行われます。

  1. 接続オブジェクトが確立されます。また、プロトコルによってリクエストの一部が読み取られる場合があります。

  2. プロトコルによって、認証済のユーザーが既存のセッションを再利用できるか、または接続を再認証する必要があるか(通常はこちら)が決定されます。

  3. 既存のセッションがセッション・プールから取り出されるか、または新しいセッションが作成されます。

  4. 認証が行われず、リクエストがHTTPのgetまたはheadの場合、セッションはANONYMOUSユーザーとして実行されます。セッションがすでにANONYMOUSユーザーとして認証されている場合は、そのまま既存のセッションを再利用できます。認証が行われている場合は、データベースの再認証ルーチンを使用して、接続が認証されます。

  5. リクエストが解析されます。

  6. (HTTPのみ)要求されたパス名がサーブレットにマップされる場合、サーブレットはJava仮想マシン(JVM)を使用して起動されます。サーブレット・コードがレスポンス・ストリームに対するレスポンスを書き出すか、またはXMLTypeインスタンスにレスポンスを書き出すように要求します。

21.4.1.3 Oracle XML DBリソースの取得

プロトコルがリソースの取得を示した場合、リソースがXMLデータまたはRAWフォームとしてストリームされることによって、リソースへのパス名が解決され、リソースがフェッチされます。

フェッチされるリソースは、XMLデータとしてストリームされます。ただし、XMLバイナリ・データ型であるXDBBinary要素を含むリソースで、そのコンテンツがRAWフォームでストリームされるものは除きます。

21.4.1.4 Oracle XML DBリソースの格納

プロトコルが、XML文書であるリソースを格納することを示した場合、その関連付けられているXML Schema (存在する場合)は、文書を格納するデフォルト表を決定するために参照されます。

Oracle XML DBは、文書のファイル名の拡張子が.xml.xsl.xsdなどであることを確認します。文書がXMLである場合、事前解析が実行されます。その場合、文書のルート要素のXML schemaLocationおよびnamespaceを判断するために十分なリソースが読み取られます。登録されたスキーマが、schemaLocation URLに配置されていて、現在の文書のルート要素に対する定義を持っている場合、その要素に対して指定されたデフォルト表を使用して、リソースのコンテンツが格納されます。

21.4.1.5 インターネット・プロトコルおよびXMLType: ストリームへのXMLTypeの直接書込み

Oracle XML DBは、Java XMLTypeメソッドwriteToStream()を使用することによって、XMLTypeレベルでインターネット・プロトコルをサポートします。このメソッドはネイティブに実装され、XMLTypeデータをプロトコルのリクエスト・ストリームに直接書き込みます。

これによって、Javaデータ型を介したデータベース・データの変換およびJavaオブジェクトの作成に伴うJava VMの実行コストとオーバーヘッドが回避され、パフォーマンスが大幅に向上します。パフォーマンスをさらに向上させるには、Javaコードが多くのリーフ要素を検索せずにルートに近いXML要素ツリーのみを処理し、作成するJavaオブジェクトの数が相対的に少なくなるようにします。

21.4.2 プロトコルおよびリソースAPIを使用したOracle ASMファイルへのアクセス (DBAの場合)

Oracle Automatic Storage Management (Oracle ASM)を使用すると、データベース・ファイルはディスク・グループに整理され、管理、データベースのミラー化およびI/Oバランシングが簡単になります。仮想リポジトリ・フォルダ/sys/asmのOracle ASMファイルもリポジトリ・アクセスの対象となります。このアクセスはデータベース管理者(DBA)用に予約されています。開発者の使用は想定していません

この種のアクセスの典型的な使用方法は、データベース・インスタンス相互の間でのOracle ASMファイルのコピーです。たとえばDBAでは、WebDAVプロトコルを使用してGraphical User Interface(GUI)でフォルダ/sys/asmを表示し、データ・ポンプ・ダンプセットのコピーを、Oracle ASMディスク・グループからオペレーティング・システムのファイル・システムにドラッグ・アンド・ドロップすることができます。

仮想フォルダ/sys/asmは、デフォルトではOracle XML DBのインストール時に作成されます。データベースがOracle ASMを使用するよう構成されていない場合は、フォルダは空で、フォルダに関する操作は許可されません。

フォルダ/sys/asmには、Oracle ASMの完全修飾ファイル名の構造で定義された階層に従うフォルダやサブフォルダが含まれます。

  • マウントされている各ディスク・グループに対応するサブフォルダが含まれます。

  • ディスク・グループ・フォルダには、そのディスク・グループを使用するデータベースに対応するサブフォルダが含まれます。ディスク・グループ・フォルダにはさらに、管理者によって作成されたOracle ASMエイリアスに対応するファイルやフォルダが含まれることがあります。

  • データベース・フォルダには、ファイル・タイプ・フォルダが含まれます。

  • ファイル・タイプ・フォルダには、バイナリのOracle ASMファイルが含まれます。

この階層を図21-5に示します。ただし、図を簡潔にするために、エイリアス用に作成されるディレクトリは省略しています。

図21-5 Oracle ASM仮想フォルダの階層

図21-5の説明が続きます
「図21-5 Oracle ASM仮想フォルダの階層」の説明

仮想フォルダ/sys/asmには、使用方法が次のように制限されます。次のことはできません

  • SQLを使用した/sys/asm問合せ

  • 通常のファイルの/sys/asmへの配置(ここに置けるのはOracle ASMファイルのみ)

  • Oracle ASMファイルの、他のOracle ASMディスク・グループや、Oracle ASM外部のフォルダへの移動(名前の変更)

  • 既存のOracle ASMファイルまたはディレクトリへのハード・リンクの作成

また、次の点があげられます。

  • フォルダ/sys/asmを表示するには、ロールDBAの権限が必要です。

  • Oracle XML DBプロトコルを使用して/sys/asmにアクセスするには、SYS以外のユーザーとしてログインする必要があります。

繰り返しますが、Oracle ASM仮想フォルダの操作はデータベース管理者による使用を想定したもので、開発者用ではありません。

関連項目:

  • /sys/asmでのFTPプロトコルの使用については、「Oracle ASMファイルに対するFTPの使用」を参照してください。

  • 完全修飾Oracle ASMファイル名の構文や仮想フォルダ構造の詳細は、『Oracle Automatic Storage Management管理者ガイド』を参照してください。

21.5 リポジトリ・リソースへの問合せベースのアクセス

PL/SQLパッケージDBMS_XDB_REPOSには、Oracle XML DBリポジトリ・リソースを操作するサブプログラムが用意されています。このAPIは、パブリック・ビューRESOURCE_VIEWPATH_VIEWに基づいており、FTPやHTTP(S)/WebDAVなどのプロトコルを介してSQLによるリポジトリ・データへのアクセスを可能にします。

  • PATH_VIEW - 一意のリポジトリ・パスごとに1つの行が存在します。

  • RESOURCE_VIEW - リソースごとに1つの行が存在します。

リポジトリに格納された文書のメタデータおよびコンテンツはいずれも、これらのビューを介してアクセスして更新できます。ビューに対する操作では、XDB$RESOURCEなどの基礎となるリポジトリ表を使用します。

各ビューには仮想列RESがあります。列RESを使用すると、リポジトリ・パス表記法に対応するSQL文を使用して、リソース・ドキュメントにアクセスして更新できます。

RESOURCE_VIEWビューには列ANY_PATHがあります。列ANY_PATHには、リソースのコンテンツにアクセスするために現行ユーザーがPL/SQLコンストラクタXDBURITypeに渡すことができる有効なURLが含まれます。このコンテンツがバイナリ・データでない場合、リソースそのものにもコンテンツが含まれます。

表21-2に、ビューの相違点をまとめています。

表21-2 PATH_VIEWとRESOURCE_VIEWの違い

PATH_VIEW RESOURCE_VIEW

リンク・プロパティを含みます。

リンク・プロパティを含みません。

リポジトリの一意の各パスに1つの行を持ちます。

リポジトリの各リソースに1つの行を持ちます。

これらのビューの行のデータ型は、XMLTypeです。RESOURCE_VIEWでは、リソースに関連付けられる単一のパスは、そのリソースを参照している可能なパスの中から任意に選択されます。Oracle XML DBにはunder_pathなどのSQL関数が用意されており、アプリケーションから特定のフォルダ内に(再帰的に)含まれているリソースを検索したり、リソースの深さを取得したりできます。

リポジトリ・ビュー上でDMLコードを使用すると、リソースのプロパティおよびコンテンツの挿入、名前の変更、削除および更新ができます。その他の操作(既存のリソースへのリンクの作成など)に対しては、プログラムAPIを使用する必要があります。

Oracle XML DBは、リンクの概念をサポートしています。リンクによって、指定した文書への複数のパスを定義できます。リンク・プロパティ文書と呼ばれる各XML文書では、(リソース固有ではなく)パス固有のメタデータ・プロパティが保持されます。リソースが作成されるたびに、最初のリンクも作成されます。

PATH_VIEWは、リンク・プロパティ文書を公開します。PATH_VIEWには、文書に対してアクセス可能なパスごとに1つのエントリがあります。PATH_VIEWの列RESには、このリンクの参照先のリソース・ドキュメントが含まれます。列PATHには、リンクがリソースへのアクセスに使用できるパスが含まれます。列LINKには、このPATHのリンク・プロパティ文書(メタデータ)が含まれます。

関連項目:

21.6 リポジトリ・リソースへのサーブレット・アクセス

Oracle XML DBは、JavaサーブレットAPIバージョン2.2を実装します。

サポートは、次の制限事項によって限定されます。

  • すべてのサーブレットが配布可能である必要があります。これらのサーブレットは、異なる仮想マシンで実行可能である必要があります。

  • WARおよびweb.xmlファイルはサポートされていません。Oracle XML DBはこのファイルのXML構成のサブセットをサポートしています。XSLTスタイルシートをweb.xmlに適用して、サーブレットの定義を生成できます。外部ツールを使用して、web.xmlファイルに定義されたサーブレットのデータベース・ロールを作成する必要があります。

  • JavaServer Pages(JSP)サポートをサーブレットとしてインストールし、手動で構成できます。

  • HTTPSessionおよび関連するクラスはサポートされません。

  • 1つのサーブレット・コンテキスト(1つのWebアプリケーション)のみがサポートされます。

21.7 リポジトリ・リソースに対する操作

Oracle XML DBリポジトリ・リソースに格納されているデータを操作するには、Java、PL/SQL、インターネット・プロトコルおよびOracle XML DB Content Connectorを使用します。最も一般的な操作およびこれらの使用に必要なデータベース権限について説明します。

次のいずれかの方法でリポジトリ・データにアクセスできます。

  • Oracle XML DB Resource APIs for Java

  • Oracle XML DB Resource View APIとOracle XML DB Resource API for PL/SQLの組合せ

  • インターネット・プロトコル(HTTP(S)、WebDAVおよびFTP)およびOracle XML DBプロトコル・サーバー

  • Oracle XML DB Content Connector、およびそれを介した標準のContent Repository API for Java(JCR)

アクセスには、様々な方法を同等に使用できます。つまり、リポジトリにコンテンツを追加する方法と、リポジトリからコンテンツを取り出す方法は、自由に選択できます。たとえば、コンテンツをリポジトリに追加する際にSQLまたはPL/SQLを使用して、コンテンツを取り出す際にインターネット・プロトコルを使用できます。使用する方法が逆でも同様です。

表21-3に、一般的なOracle XML DBリポジトリの操作を示し、いくつかのアクセス方法を使用してこれらの操作をどのように実行できるかを説明します。この表ではそれぞれの方法に共通の機能を示しますが、それらすべての方法が、特定のタスクに対して同じように適しているわけではありません。特に説明がなければ、この表で使用される「リソース」とは、ファイル・リソースまたはフォルダ・リソースのいずれかを表します。

表21-3は、各操作に必要なリソース権限も示しています。

表21-3 Oracle XML DBリポジトリへのアクセス: APIオプション

データ・アクセス SQLおよびPL/SQL プロトコル 必要なリソース権限 JCRのサポート

リソースの作成

DBMS_XDB_REPOS.createResource(
  '/public/T1/testcase.txt',
  'ORIGINAL text');
INSERT INTO RESOURCE_VIEW (ANY_PATH, RES)
SELECT '/public/T1/copy1.txt', RES
  FROM RESOURCE_VIEW
  WHERE equals_path(RES, 
                    '/public/T1/testcase.txt')
        = 1;

HTTP:PUT;

FTP: PUT

親フォルダに対するDAV::bind

サポート

リソース・コンテンツの更新

UPDATE RESOURCE_VIEW
SET RES =
XMLQuery(
  'declare default element namespace
   "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
   copy $i := $p1 modify
     (for $j in $i/Resource/Contents/text
      return replace value of node $j with $p2)
   return $i'
  PASSING RES AS "p1", 'NEW text' AS "p2"
  RETURNING CONTENT)
WHERE equals_path(RES, '/public/T1/copy1.txt') = 1

HTTP: PUT;

FTP: PUT

リソースに対するxdb:write-content

サポート

リソース・プロトコルの更新

UPDATE RESOURCE_VIEW
SET RES =
XMLQuery(
  'declare default element namespace
"http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
   copy $i := $p1 modify
     (for $j in $i/Resource/DisplayName
      return replace value of node $j with $p2)
   return $i'
  PASSING RES AS "p1", 'NewName1.txt' AS "p2" RETURNING CONTENT)
WHERE equals_path(RES, '/public/T1/copy1.txt') = 1;

WebDAV:

PROPPATCH;

リソースに対するDAV::write-properties

サポート

リソースACLの更新

EXEC DBMS_XDB_REPOS.setACL(
  '/public/T1/copy1.txt',
  '/sys/acls/all_owner_acl.xml');

適用なし

リソースに対するDAV::write-acl

非サポート

リソースのリンク解除(最新のリンクの削除)

EXEC DBMS_XDB_REPOS.deleteResource()

または

DELETE FROM RESOURCE_VIEW
  WHERE equals_path(RES, path) > 0

HTTP:

DELETE;

FTP:delete

親フォルダに対するDAV::unbind

リソースに対するxdb:unlink-from

サポート

リソースへのすべてのリンクの強制削除

DBMS_XDB_REPOS.deleteResource()

または

DELETE FROM PATH_VIEW
WHERE
XMLCast(
XMLQuery(
  'declare namespace n1=
"http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
   //n1:DisplayName'
  PASSING RES RETURNING CONTENT)
AS VARCHAR2(256))
= 'My resource'

FTP:

quote

rm_rf

リソース

すべての親フォルダに対するDAV::unbind

リソースに対するxdb:unlink-from

サポート

リソースの移動

UPDATE PATH_VIEW
  SET path = '/public/T1/copy2.txt'
  WHERE equals_path(RES,
                    '/public/T1/copy1.txt')
        = 1;

WebDAV:

MOVE;

FTP: rename

ソース親フォルダに対するDAV::unbind

ターゲット親フォルダに対するDAV::bind

リソースに対するxdb:unlink-fromおよびxdb:link-to

サポート

リソースのコピー

INSERT INTO PATH_VIEW (path, RES, link)
  SELECT '/public/T1/copy3.txt', RES, link
    FROM PATH_VIEW
    WHERE equals_path(RES,
                      '/public/T1/copy2.txt')
          = 1;

WebDAV:

COPY;

新規コピー:

ターゲット親フォルダに対するDAV::bind

リソースに対するDAV::read

上書きコピー(置換):

リソースに対するDAV::read

既存のターゲット・リソースに対するDAV::write-propertiesおよびDAV::write-content

サポート

既存リソースへのハード・リンクの作成

EXEC DBMS_XDB_REPOS.link('/public/T1/copy3.txt', 
                         '/public/T1',
                         'myhardlink');

適用なし

親フォルダに対するDAV::bind

リソースに対するxdb:link-to

非サポート

既存リソースへの弱いリンクの作成

EXEC DBMS_XDB_REPOS.link(
  '/public/T1/copy3.txt', 
  '/public/T1',
  'myweaklink',
  DBMS_XDB_REPOS.LINK_TYPE_WEAK);

適用なし

親フォルダに対するDAV::bind

リソースに対するxdb:link-to

非サポート

リソースの所有者の変更

UPDATE RESOURCE_VIEW
SET RES =
XMLQuery(
  'copy $i := $p1 modify
     (for $j in $i/Resource/Owner
      return replace value of node $j with $p2)
   return $i'
  PASSING RES AS "p1", 'U2' AS "p2" RETURNING CONTENT)
WHERE equals_path(RES, '/public/T1/copy3.txt') = 1;

適用なし

リソースに対するDAV::take-ownership

サポート

リソース・コンテンツのバイナリ表現またはテキスト表現の取得

SELECT XDBURIType(path).getBLOB()
  FROM DUAL;

SELECT
XMLQuery(
'declare default element namespace
"http://xmlns.oracle.com/xdb/XDBResource.xsd";(: :)
 $r/Resource/Contents'
PASSING RES AS "r" RETURNING CONTENT)
FROM RESOURCE_VIEW
WHERE equals_path(RES, '/public/T1/copy2.text') = 1;

HTTP: GET;

FTP: get

リソースに対するxdb:read-contents

サポート

リソース・コンテンツのXMLType表現の取得

SELECT XDBURIType('/public/T1/res.xml').getXML
  FROM DUAL;
SELECT 
XMLQuery(
'declare default element namespace
"http://xmlns.oracle.com/xdb/XDBResource.xsd";(: :)
 $r/Resource/Contents/*'
PASSING RES AS "r" RETURNING CONTENT)
FROM RESOURCE_VIEW 
WHERE equals_path(RES, '/public/T1/res.xml') = 1;

適用なし

リソースに対するxdb:read-contents

非サポート

リソース・プロトコルの取得

SELECT
XMLCast(
XMLQuery(
'declare default element namespace
"http://xmlns.oracle.com/xdb/XDBResource.xsd";(: :)
$r/Resource/LastModifier'
PASSING RES AS "r" RETURNING CONTENT)
AS VARCHAR2(128))
FROM RESOURCE_VIEW
WHERE equals_path(RES, '/public/T1/res.xml') = 1;

WebDAV:

PROPFIND

(depth = 0);

リソースに対するxdb:read-properties

サポート

フォルダ内のリソースのリスト

SELECT PATH FROM PATH_VIEW
  WHERE under_path(res, '/public/T1') = 1;

WebDAV:

PROPFIND

(depth = 0);

フォルダに対するxdb:read-contents

サポート

フォルダの作成

Call DBMS_XDB_REPOS.createFolder('/public/T2');

WebDAV:

MKCOL;

FTP: mkdir

親フォルダに対するDAV::bind

サポート

フォルダのリンク解除

DBMS_XDB_REPOS.deleteResource('/public/T2')

HTTP:

DELETE;

FTP: rmdir

親フォルダに対するDAV::unbind

リソースに対するxdb:unlink-from

サポート

フォルダおよびそのフォルダに対するすべてのリンクの強制削除

DBMS_XDB_REPOS.deleteResource(
  '/public/T2',
  DBMS_XDB.DELETE_RECURSIVE_FORCE);

適用なし

すべての親フォルダに対するDAV::unbind

フォルダ・リソースに対するxdb:unlink-from

サポート

行ロックされたリソースの取得

SELECT ... 
  FROM RESOURCE_VIEW
  FOR UPDATE ...;

適用なし

リソースに対するxdb:read-propertiesおよびxdb:read-contents

非サポート

リソースへのWebDAVロックの追加

EXEC DBMS_XDB_REPOS.LockResource(
  '/public/T1/res.xml',
  TRUE,
  TRUE);

WebDAV:

LOCK;

FTP:

quote lock

リソースに対するDAV::write-properties

非サポート

WebDAVロックの削除

DECLARE...
BEGIN 
  DBMS_XDB_REPOS.GetLockToken('/public/T1/res.xml', 
                              locktoken); 
  DBMS_XDB_REPOS.UnlockResource(
    '/public/T1/res.xml',
    locktoken);
END; 

WebDAV: UNLOCK;

FTP:

quote unlock

リソースに対するDAV::write-propertiesおよびDAV::unlock

非サポート

ファイル・リソースのチェックアウト

EXEC DBMS_XDB_VERSION.checkOut(
  '/public/T1/res.xml');

適用なし

リソースに対するDAV::write-properties

非サポート

ファイル・リソースのチェックイン

EXEC DBMS_XDB_VERSION.checkIn(
  '/public/T1/res.xml');

適用なし

リソースに対するDAV::write-properties

非サポート

ファイル・リソースのチェックアウトのキャンセル

EXEC DBMS_XDB_VERSION.unCheckOut(
  '/public/T1/res.xml');

適用なし

リソースに対するDAV::write-properties

非サポート

ファイル・リソースのバージョニング

EXEC DBMS_XDB_VERSION.makeVersioned(
  '/public/T1/res.xml');

適用なし

リソースに対するDAV::write-properties

非サポート

イベント・ハンドラの削除

DBMS_XEVENT.remove

適用なし

リソースまたは親フォルダ(コンテキストによる)に対するxdb:write-config

非サポート

変更のコミット

COMMIT;

各リクエスト後の自動コミット

適用なし

サポート

変更のロールバック

ROLLBACK;

適用なし

適用なし

サポート

表21-3にリストされている権限に加え、操作により影響を受ける各リソースに対しては権限xdb:read-propertiesが必要です。また、その操作のターゲットとなるリソースに加え、リソースの親フォルダに影響を与える操作を実行するには、その親フォルダに対しても権限xdb:read-propertiesが必要です。たとえば、あるリソースに対する削除操作は、削除するリソースおよびその親フォルダに影響を及ぼします。したがってこの場合は、対象のリソースおよびその親フォルダに対して権限xdb:read-propertiesが必要です。

関連項目:

21.8 SQLを使用したリポジトリ・リソースのコンテンツへのアクセス

SQLでは、Oracle XML DBリポジトリの文書のコンテンツにアクセスするには、PL/SQLコンストラクタXDBURITypeを使用するか、RESOURCE_VIEWおよび対応するリソース・ドキュメントを使用します。

最も簡単な方法は、XDBURITypeを使用することです。このコンストラクタにURLを渡し、アクセスするリソースを指定します。このURLは、リポジトリのルートから始まると想定されます。オブジェクト型XDBURITypeには、リソースに関連付けることのできる様々な種類のコンテンツにアクセスするためのメソッドgetBLOB()getCLOB()およびgetXML()が用意されています。

例21-4では、コンストラクタXDBURITypeを使用してテキスト・ドキュメントのコンテンツにアクセスします。

文書のコンテンツには、RESOURCE_VIEWおよび対応するリソース・ドキュメントを使用してもアクセスできます。例21-5では、これを実行してテキスト・ドキュメントのコンテンツにアクセスします。

XML文書(XML Schemaに基づくまたはXML Schemaに基づかない)のコンテンツには、この方法でもアクセスできます。例21-6では、XML文書のノードおよび対応するリソース・ドキュメントのノードが含まれたXPath式を使用して、PurchaseOrder文書のコンテンツにアクセスします。

例21-6では、名前空間接頭辞rを使用し、リソースの名前空間のメンバーであるノードをXPath式から識別しています。名前空間接頭辞rは、SQL/XML関数XMLTableXMLNAMESPACES句を使用して定義されます。発注書XML Schemaで名前空間が定義されておらず、名前空間接頭辞をPurchaseOrder文書のノードに適用できないため、ここでは名前空間の宣言が必要になります。

関連項目:

XMLTableXMLNAMESPACES句の詳細は、XQueryとOracle XML DBを参照してください。

例21-4 XDBURITYPEを使用したリポジトリ内のテキスト・ドキュメントへのアクセス

SELECT XDBURIType('/home/QUINE/NurseryRhyme.txt').getCLOB() FROM DUAL;
 
XDBURITYPE('/HOME/QUINE/NURSERYRHYME.TXT').GETCLOB()
----------------------------------------------------
Mary had a little lamb
Its fleece was white as snow
and everywhere that Mary went
that lamb was sure to go
 
1 row selected.

例21-5 RESOURCE_VIEWを使用したリソース・コンテンツへのアクセス

SELECT CONTENT
  FROM RESOURCE_VIEW,
       XMLTable(XMLNAMESPACES (default 'http://xmlns.oracle.com/xdb/XDBResource.xsd'),
                '/Resource/Contents' PASSING RES
                COLUMNS content CLOB PATH 'text')
  WHERE equals_path(RES, '/home/QUINE/NurseryRhyme.txt') = 1;
 
CONTENT
-------
Mary had a little lamb
Its fleece was white as snow
and everywhere that Mary went
that lamb was sure to go
 
1 row selected.

例21-6 リソースと名前空間接頭辞を使用したXML文書へのアクセス

SELECT des.description
  FROM RESOURCE_VIEW rv,
       XMLTable(XMLNAMESPACES ('http://xmlns.oracle.com/xdb/XDBResource.xsd' AS "r"),
                '/r:Resource/r:Contents/PurchaseOrder/LineItems/LineItem'
                PASSING rv.RES
                COLUMNS description VARCHAR2(256) PATH 'Description') des
  WHERE 
    equals_path(rv.RES, '/home/QUINE/PurchaseOrders/2002/Mar/SBELL-2002100912333601PDT.xml') = 1;

DES.DESCRIPTION
---------------------------------
A Night to Remember
The Unbearable Lightness Of Being
The Wizard of Oz
 
3 rows selected.

21.9 XML Schemaに基づく文書のコンテンツへのアクセス

XML Schemaに基づく文書のコンテンツにアクセスするには、スキーマに基づかない文書の場合と同様、対応するリソース・ドキュメントを使用します。または、XML SchemaをOracle XML DBに登録したときに定義したデフォルト表の行としてアクセスします。

最初の場合は、RESOURCE_VIEWを使用して、XML Schemaに基づく様々な種類の文書を1つのSQL文で問い合せることができます。

21.9.1 結合でXMLRef要素を使用した、リソース・コンテンツへのアクセス

リソース・ドキュメントの要素XMLRefは、SQL文で単一の操作の一部としてメタデータおよびコンテンツにアクセスまたは更新する必要があるときに必要な結合キーを提供します。

ここでの例は、要素XMLRefの値に基づく結合を使用して、リソース・コンテンツにアクセスする問合せを示しています。

例21-7では、Oracle XML DBリポジトリのパスに基づいて、defaultTableの行を検索します。SQL関数refは、リソース・ドキュメントRES内のXMLRef要素の値に基づいて、デフォルト表内のターゲットの行を検索します。

例21-8では、メタデータ、パスおよびコンテンツに基づいて、XML文書からフラグメントを選択する方法を示します。この問合せは、/home/QUINE/PurchaseOrders/2002/Marの下にあり、部品番号715515009058の発注が含まれる文書に対して、要素Referenceの値を戻します。

通常、XML Schemaに基づくXML文書のコンテンツにアクセスするときは、RESOURCE_VIEWまたはPATH_VIEWを単独で使用するよりも、RESOURCE_VIEWまたはPATH_VIEWをデフォルト表と結合して使用した方が効率的です。リソース・ドキュメントとデフォルト表を明示的に結合することによって、Oracle XML DBは、SQL文が1種類のXML文書に対してのみ機能することを認識します。したがって、XPathのリライトを使用すれば、デフォルト表およびリソースに対する操作を最適化できます。

例21-7 SQL関数REFおよび要素XMLRefを使用した、リポジトリのリソース・データの問合せ

SELECT des.description
  FROM RESOURCE_VIEW rv,
       purchaseorder p,
       XMLTable('$p/PurchaseOrder/LineItems/LineItem' PASSING p.OBJECT_VALUE AS "p"
                COLUMNS description VARCHAR2(256) PATH 'Description') des
  WHERE equals_path(rv.RES, '/home/QUINE/PurchaseOrders/2002/Mar/SBELL-2002100912333601PDT.xml')
        = 1
    AND ref(p) = XMLCast(XMLQuery('declare default element namespace
                                  "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                                  fn:data(/Resource/XMLRef)' PASSING rv.RES RETURNING CONTENT)
                         AS REF XMLType);
 
DES.DESCRIPTION
---------------------------------
A Night to Remember
The Unbearable Lightness Of Being
The Wizard of Oz
 
3 rows selected.

例21-8 メタデータ、パスおよびコンテンツに基づくXML文書のフラグメントの選択

SELECT XMLCast(XMLQuery('$p/PurchaseOrder/Reference'
                        PASSING po.OBJECT_VALUE AS "p" RETURNING CONTENT)
               AS VARCHAR2(30))
  FROM RESOURCE_VIEW rv, purchaseorder po
  WHERE under_path(rv.RES, '/home/QUINE/PurchaseOrders/2002/Mar') = 1
    AND ref(po) = XMLCast(
                    XMLQuery('declare default element namespace
                              "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                              fn:data(/Resource/XMLRef)'
                             PASSING rv.RES RETURNING CONTENT)
                          AS REF XMLType)
    AND XMLExists('$p/PurchaseOrder/LineItems/LineItem/Part[@Id="715515009058"]'
                  PASSING po.OBJECT_VALUE AS "p");

XMLCAST(XMLQUERY('$P/PURCHASEO
------------------------------
CJOHNSON-20021009123335851PDT
LSMITH-2002100912333661PDT
SBELL-2002100912333601PDT
 
3 rows selected.

21.10 リポジトリの文書のコンテンツの更新

Oracle XML DBリポジトリに格納された文書のコンテンツは、インターネット・プロトコルまたはSQLを使用して更新できます。

21.10.1 インターネット・プロトコルを使用したリポジトリのコンテンツの更新

最も一般的なコンテンツ作成ツールは、HTTP、FTPおよびWebDAVプロトコルをサポートしています。適切なアクセス権限が付与されている場合、Oracle XML DBリポジトリに格納されたコンテンツにアクセスして編集するには、更新する文書をターゲットとする簡単なURLのみが必要です。

一般的なコンテンツ作成ツールでは、URLが指定されたHTTP動詞getを使用して文書のコンテンツにアクセスでき、HTTP動詞putを使用して、更新されたコンテンツを保存できます。

図21-6に、Microsoft WordのWebDAVサポートを使用して、Oracle XML DBリポジトリに格納された文書をMicrosoft Wordで更新および編集する方法を示します。

図21-6 Microsoft Wordを使用した、Oracle XML DBに格納されたコンテンツの更新および編集

図21-6の説明が続きます
「図21-6 Microsoft Wordを使用した、Oracle XML DBに格納されたコンテンツの更新および編集」の説明

Microsoft Wordなどの編集アプリケーションを使用してOracle XML DBに格納されたXML文書を更新すると、データベースは、文書の新しいコンテンツを含む入力ストリームを受け取ります。ただし、文書にどのような変更が加えられたかについて、WordなどのアプリケーションからOracle XML DBに伝達する方法はありません。このため、部分的に更新することはできません。文書全体を再度解析し、元の文書から導出されたすべてのオブジェクトを、新しいコンテンツから導出されたオブジェクトに置き換える必要があります。

21.10.2 SQLを使用したリポジトリのコンテンツの更新

XQuery Updateを使用すると、Oracle XML DBリポジトリに格納された文書のコンテンツを更新できます。文書のコンテンツを変更するには、リソース・ドキュメントまたは文書のコンテンツを保持するデフォルト表を更新します。

21.10.2.1 リソース・ドキュメントの更新によるリポジトリ内の文書の更新

ドキュメントのコンテンツを更新するには、SQL UPDATE文およびSQL関数XMLQueryとXQuery Updateを使用します。XQuery式が更新操作のターゲットとしてXMLQueryに渡されます。

例21-9では、簡単なテキスト・ドキュメントのコンテンツを更新します。更新操作のターゲットとしてXMLQueryに渡されたXQuery式により、要素/Resource/Contents/textに属するテキスト・ノードが識別されます。

関連するリソースの更新によって文書のコンテンツを更新する方法のメリットは、Oracle XML DBリポジトリに格納されたあらゆる種類の文書を更新できることです。

例21-10では、対応するリソース・ドキュメントでSQL UPDATE操作を実行して、XML文書のノードを更新します。ここでは、XQuery Updateを使用して、要素Userに関連付けられたテキスト・ノードの値を変更します。

例21-9 リソースでUPDATEとXQuery Updateを使用したテキスト・ドキュメントの更新

DECLARE
  file         BFILE;
  contents     CLOB;
  dest_offset  NUMBER := 1;
  src_offset   NUMBER := 1;
  lang_context NUMBER := 0;
  conv_warning NUMBER := 0;
BEGIN
  file := bfilename('XMLDIR', 'tdadxdb-03-02.txt');
  DBMS_LOB.createTemporary(contents, true, DBMS_LOB.SESSION);
  DBMS_LOB.fileopen(file, DBMS_LOB.file_readonly);
  DBMS_LOB.loadClobfromFile(contents,
                            file,
                            DBMS_LOB.getLength(file),
                            dest_offset,
                            src_offset,
                            nls_charset_id('AL32UTF8'),
                            lang_context,
                            conv_warning);
  DBMS_LOB.fileclose(file);
  UPDATE RESOURCE_VIEW
    SET RES =
      XMLQuery('declare default element namespace 
                  "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                copy $i := $p1 modify
                  (for $j in $i/Resource/Contents/text
                   return replace value of node $j with $p2)
                return $i'
               PASSING RES AS "p1", contents AS "p2" RETURNING CONTENT)
    WHERE equals_path(res, '/home/QUINE/NurseryRhyme.txt') = 1;
  DBMS_LOB.freeTemporary(contents);
END;
/

例21-10 リソースでUPDATEとXQuery Updateを使用したXMLノードの更新

UPDATE RESOURCE_VIEW
  SET RES =
    XMLQuery('declare namespace r="http://xmlns.oracle.com/xdb/XDBResource.xsd";
              copy $i := $p1 modify
                (for $j in $i/r:Resource/r:Contents/PurchaseOrder/User
                 return replace value of node $j with $p2)
              return $i'
             PASSING RES AS "p1", 'SKING' AS "p2" RETURNING CONTENT)
    WHERE equals_path(res, '/home/QUINE/PurchaseOrders/2002/Mar/SBELL-2002100912333601PDT.xml')
          = 1;
 
1 row updated.

SELECT XMLCast(XMLQuery(
                 'declare namespace ns="http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                  $r/ns:Resource/ns:Contents/PurchaseOrder/User/text()'
                 PASSING RES AS "r" RETURNING CONTENT)
               AS VARCHAR2(32))
  FROM RESOURCE_VIEW
  WHERE equals_path(RES,
                    '/home/QUINE/PurchaseOrders/2002/Mar/SBELL-2002100912333601PDT.xml')
        = 1;

XMLCAST(XMLQUERY('DECLARENAMESPA
--------------------------------
SKING

1 row selected.

21.10.2.2 デフォルト表の更新によるリポジトリ内のXML Schemaに基づく文書の更新

文書のコンテンツを管理するために使用するデフォルト表に対して更新操作を直接実行することによって、XML Schemaに基づく文書を更新できます。

メタデータに基づくパスまたは条件が含まれたWHERE句を使用して文書を配置する必要がある場合、SQL UPDATE文では、リソースとデフォルト表の間の結合を使用する必要があります。

一般に、XML Schemaに基づく文書のコンテンツを更新する場合は、RESOURCE_VIEWまたはPATH_VIEWを単独で使用するよりも、RESOURCE_VIEWまたはPATH_VIEWをデフォルト表と結合して使用するほうが効率的です。リソース・ドキュメントとデフォルト表を明示的に結合することによって、Oracle XML DBは、SQL文が1種類のXML文書に対してのみ機能することを認識します。これによって、デフォルト表およびリソースで部分更新を使用できます。

例21-11では、ターゲットの行をパスによって識別し、デフォルト表に対してXQuery Updateを使用します。更新される行は、REFによって識別されます。REFは、Oracle SQL関数equals_pathを使用して、リポジトリ・パスによって識別されます。これにより、更新対象は、指定されたパスで識別されるリソースに対応する行のみに制限されます。

例21-11 リポジトリ内のXML Schemaに基づく文書の更新

UPDATE purchaseorder p
  SET p.OBJECT_VALUE =
    XMLQuery('copy $i := $p1 modify
                (for $j in $i/PurchaseOrder/User
                 return replace value of node $j with $p2)
              return $i'
             PASSING p.OBJECT_VALUE AS "p1", 'SBELL' AS "p2" RETURNING CONTENT)
    WHERE ref(p) =
      (SELECT XMLCast(XMLQuery('declare default element namespace
                                  "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                                fn:data(/Resource/XMLRef)'
                               PASSING rv.RES RETURNING CONTENT) AS REF XMLType)
         FROM RESOURCE_VIEW rv
         WHERE equals_path(rv.RES,
                           '/home/QUINE/PurchaseOrders/2002/Mar/SBELL-2002100912333601PDT.xml')
               = 1);

SELECT XMLCast(XMLQuery('$p/PurchaseOrder/User/text()'
                        PASSING p.OBJECT_VALUE AS "p" RETURNING CONTENT)
               AS VARCHAR2(32))
  FROM purchaseorder p, RESOURCE_VIEW rv
  WHERE ref(p) = XMLCast(XMLQuery('declare default element namespace
                                "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                                fn:data(/Resource/XMLRef)' PASSING rv.RES RETURNING CONTENT)
                      AS REF XMLType)
    AND equals_path(rv.RES, '/home/QUINE/PurchaseOrders/2002/Mar/SBELL-2002100912333601PDT.xml')
        = 1;

XMLCAST(XMLQUERY('$P/PURCHASEO
------------------------------
SBELL

21.11 RESOURCE_VIEWおよびPATH_VIEW内のリソースの問合せ

ここでの例は、RESOURCE_VIEWおよびPATH_VIEWと、Oracle SQL関数equals_pathおよびunder_pathを使用したリポジトリのフォルダ限定の問合せを示しています。

Oracle XML DBには、フォルダ限定の問合せを実行するために使用できるOracle SQL関数equals_pathおよびunder_pathの2つが用意されています。このような問合せは、RESOURCE_VIEWまたはPATH_VIEWを操作するSQL文を、Oracle XML DBのフォルダ階層内の特定の場所にある文書に制限します。

関数equals_pathは、SQL文を、指定したパスで識別される単一の文書に制限します。関数under_pathは、SQL文を、階層内の特定の場所より下位に存在する文書に制限します。

ここでの例は、RESOURCE_VIEWおよびPATH_VIEWに格納されたリソース・ドキュメントに対する簡単なフォルダ限定の問合せを示しています。

例21-12の問合せでは、SQL関数equals_pathRESOURCE_VIEWを使用してリソースにアクセスしています。問い合せるリソースは、例21-9の更新操作で得られた結果です。例21-4例21-5に示す元のリソースのテキストが、別の童謡「Hickory Dickory Dock...」の歌詞に置き換えられています。

例21-12に示すように、リソース・ドキュメントは、DAV標準で定義された一連のメタデータを取得するXML文書です。メタデータには、CreationDateCreatorOwnerModificationDateDisplayNameなどの情報が含まれています。リソース・ドキュメントのコンテンツは、SQL/XMLアクセスおよび問合せ関数を使用して、他のXML文書と同様の方法で問合せおよび更新ができます。

例21-13の問合せにより、Oracle XML DBリポジトリに格納された各XSLスタイルシートへのパスを検索します。これは.xslで終わるDisplayNameの検索を実行します。

例21-14の問合せでは、パス/home/QUINE/PurchaseOrdersの下に存在するリソース(ファイルおよびフォルダ)の数をカウントします。PATH_VIEWではなくRESOURCE_VIEWを使用すると、複数リンクのターゲットであるリソースは1回のみカウントされます。SQL関数under_pathを使用すると、結果セットは、/home/QUINE/PurchaseOrdersで始まるパスを使用してアクセス可能な文書に制限されます。

例21-15の問合せは、パス/home/QUINE/PurchaseOrders/2002/Aprで識別されるフォルダのコンテンツをリストします。この問合せによって、フォルダ内のディレクトリのリストを効率的に作成できます。

例21-16の問合せは、パス/home/QUINE/PurchaseOrders/2002/Aprで識別されるフォルダに含まれる、関連するリソースのDisplayName要素がSで始まる一連のリンクをリストします。

例21-17の問合せにより、PurchaseOrder文書を含む、Oracle XML DBリポジトリの各リソースへのパスを検索します。文書はXML Schema URLおよびリポジトリに格納されたスキーマに基づくXMLデータのグローバル要素を識別する、メタデータ・プロパティSchemaElementに基づき識別されます。

例21-12 EQUALS_PATHおよびRESOURCE_VIEWを使用したリソースへのアクセス

SELECT XMLSerialize(DOCUMENT r.res AS CLOB)
  FROM RESOURCE_VIEW r
  WHERE equals_path(res, '/home/QUINE/NurseryRhyme.txt') = 1;
 
XMLSERIALIZE(DOCUMENTR.RESASCLOB)
--------------------------------------------------------------------------------
<Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd" 
          Hidden="false" 
          Invalid="false" 
          Container="false" 
          CustomRslv="false" 
          VersionHistory="false" 
          StickyRef="true">
  <CreationDate>2005-06-13T13:19:20.566623</CreationDate>
  <ModificationDate>2005-06-13T13:19:22.997831</ModificationDate>
  <DisplayName>NurseryRhyme.txt</DisplayName>
  <Language>en-US</Language>
  <CharacterSet>UTF-8</CharacterSet>
  <ContentType>text/plain</ContentType>
  <RefCount>1</RefCount>
  <ACL>
    <acl description=
         "Private:All privileges to OWNER only and not accessible to others"
         xmlns="http://xmlns.oracle.com/xdb/acl.xsd" xmlns:dav="DAV:"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xsi:schemaLocation="http://xmlns.oracle.com/xdb/acl.xsd
         http://xmlns.oracle.com/xdb/acl.xsd"
         shared="true">
      <ace>
        <grant>true</grant>
        <principal>dav:owner</principal>
        <privilege>
          <all/>
        </privilege>
      </ace>
    </acl>
  </ACL>
  <Owner>QUINE</Owner>
  <Creator>QUINE</Creator>
  <LastModifier>QUINE</LastModifier>
  <SchemaElement>http://xmlns.oracle.com/xdb/XDBSchema.xsd#text</SchemaElement>
  <Contents>
    <text>Hickory Dickory Dock
The Mouse ran up the clock
The clock struck one
The Mouse ran down
Hickory Dickory Dock
    </text>
  </Contents>
</Resource>
 
1 row selected.

例21-13 リポジトリに格納されたXSLTスタイルシートへのパスの判別

SELECT ANY_PATH FROM RESOURCE_VIEW
  WHERE XMLCast(XMLQuery(
                  'declare namespace ns="http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                   $r/ns:Resource/ns:DisplayName'
                  PASSING RES AS "r" RETURNING CONTENT)
                AS VARCHAR2(100))
        LIKE '%.xsl';
 
ANY_PATH
-------------------------------------------
/home/MDSYS/epsg/sdoepsggrid2nadcon.xsl
/home/MDSYS/epsg/sdoepsggrid2ntv2/xsl
/source/schemas/poSource/xsl/empdept.xsl
/source/schemas/poSource/xsl/purchaseOrder.xsl
 
4 rows selected.

例21-14 パスの下に存在するリソースのカウント

SELECT count(*)
   FROM RESOURCE_VIEW
   WHERE under_path(RES, '/home/QUINE/PurchaseOrders') = 1;
 
  COUNT(*)
----------
       145

1 row selected.

例21-15 パス内のフォルダのコンテンツのリスト

SELECT PATH
  FROM PATH_VIEW
  WHERE under_path(RES, '/home/QUINE/PurchaseOrders/2002/Apr') = 1;
 
PATH
----------------------------------------------------------------------
/home/QUINE/PurchaseOrders/2002/Apr/AMCEWEN-20021009123336171PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/AMCEWEN-20021009123336271PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/EABEL-20021009123336251PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/PTUCKER-20021009123336191PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/PTUCKER-20021009123336291PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SBELL-20021009123336231PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SBELL-20021009123336331PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SKING-20021009123336321PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SMCCAIN-20021009123336151PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SMCCAIN-20021009123336341PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/VJONES-20021009123336301PDT.xml
 
11 rows selected.

例21-16 フォルダに含まれているリンクのリスト

SELECT PATH
  FROM PATH_VIEW
  WHERE XMLCast(XMLQuery(
                  'declare namespace ns="http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                   $r/ns:Resource/ns:DisplayName'
                  PASSING RES AS "r" RETURNING CONTENT)
                AS VARCHAR2(100))
        LIKE 'S%'
    AND under_path(RES, '/home/QUINE/PurchaseOrders/2002/Apr') = 1;
 
PATH
----------------------------------------------------------------------
/home/QUINE/PurchaseOrders/2002/Apr/SBELL-20021009123336231PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SBELL-20021009123336331PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SKING-20021009123336321PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SMCCAIN-20021009123336151PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/SMCCAIN-20021009123336341PDT.xml
 
5 rows selected.

例21-17 発注書のXML文書が含まれたリソースへのパスの検索

SELECT ANY_PATH
  FROM RESOURCE_VIEW
 WHERE XMLExists(
         'declare namespace ns="http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
          $r/ns:Resource[ns:SchemaElement=
          "http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd#PurchaseOrder"]'
         PASSING RES AS "r");

この問合せは次のパスを戻します。それぞれのパスにPurchaseOrder文書が含まれています。

ANY_PATH
-----------------------------------------------------------------------
/home/QUINE/PurchaseOrders/2002/Apr/AMCEWEN-20021009123336171PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/AMCEWEN-20021009123336271PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/EABEL-20021009123336251PDT.xml
/home/QUINE/PurchaseOrders/2002/Apr/PTUCKER-20021009123336191PDT.xml

...

132 rows selected.

21.12 Oracle XML DBの階層リポジトリ索引

Oracle XML DBでは、Oracle XML DBリポジトリの階層索引を使用して、リポジトリのパスに基づく問合せと、フォルダ限定の問合せのパフォーマンスを最適化します。これは、Oracleドメイン索引として実装されます。

従来のリレーショナル・データベースでは、パスベースのアクセスおよびフォルダ限定の問合せはCONNECT BY操作を使用して実装します。このような問合せはコストがかかるため、パスベースのアクセスおよびフォルダ限定の問合せは、文書の数やフォルダ階層の深さが増すにつれて効率が下がる可能性があります。

この問題に対処するために、Oracle XML DBでは階層リポジトリ索引という新しい索引タイプが導入されました。これを使用すると、CONNECT BY操作を使用しなくても、データベースでフォルダ限定の問合せを解決できます。したがって、Oracle XML DBでは、パスベースおよびフォルダ限定の問合せを効率的に実行できます。階層リポジトリ索引は、Oracleのドメイン索引として実装されます。これは、Oracle Text索引のサポートおよび他の多数の高度な索引タイプをデータベースに追加する場合の方法と同じです。

例21-18では、フォルダ限定の問合せで生成された実行計画の出力を示します。次に示すように、階層リポジトリ索引(XDBHI_IDX)を使用して問合せを解決します。

例21-18 フォルダ限定の問合せの実行計画の出力

SELECT PATH
  FROM PATH_VIEW
  WHERE XMLCast(
          XMLQuery(
            'declare namespace ns="http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
             $r/ns:Resource/ns:DisplayName'
            PASSING RES AS "r" RETURNING CONTENT)
          AS VARCHAR2(100))
        LIKE 'S%'
    AND under_path(RES, '/home/QUINE/PurchaseOrders/2002/Apr') = 1;
 
PLAN_TABLE_OUTPUT
------------------------------------------------------------------------------------------------------
Plan hash value: 2568289845
 
------------------------------------------------------------------------------------------------------
| Id  | Operation                            | Name          | Rows  | Bytes | Cost (%CPU)| Time     |
------------------------------------------------------------------------------------------------------
|   0 | SELECT STATEMENT                     |               |    17 |  3111 |    34   (6)| 00:00:01 |
|   1 |  NESTED LOOPS                        |               |    17 |  3111 |    34   (6)| 00:00:01 |
|   2 |   NESTED LOOPS                       |               |    17 |  2822 |    34   (6)| 00:00:01 |
|   3 |    NESTED LOOPS                      |               |   466 | 63842 |    34   (6)| 00:00:01 |
|*  4 |     TABLE ACCESS BY INDEX ROWID      | XDB$RESOURCE  |     1 |   135 |     3   (0)| 00:00:01 |
|*  5 |      DOMAIN INDEX                    | XDBHI_IDX     |       |       |            |          |
|   6 |     COLLECTION ITERATOR PICKLER FETCH|               |       |       |            |          |
|*  7 |    INDEX UNIQUE SCAN                 | XDB_PK_H_LINK |     1 |    28 |     0   (0)| 00:00:01 |
|*  8 |   INDEX UNIQUE SCAN                  | SYS_C003900   |     1 |    17 |     0   (0)| 00:00:01 |
------------------------------------------------------------------------------------------------------
 
Predicate Information (identified by operation id):
---------------------------------------------------
 
   4 - filter(CAST("P"."SYS_NC00011$" AS VARCHAR2(100)) LIKE 'S%')
   5 - access("XDB"."UNDER_PATH"(SYS_MAKEXML('8758D485E6004793E034080020B242C6',734,"XMLEXTRA"
              ,"XMLDATA"),'/home/QUINE/PurchaseOrders/2002/Apr',9999)=1)
   7 - access("H"."PARENT_OID"=SYS_OP_ATG(VALUE(KOKBF$),3,4,2) AND
              "H"."NAME"=SYS_OP_ATG(VALUE(KOKBF$),2,3,2))
   8 - access("R2"."SYS_NC_OID$"=SYS_OP_ATG(VALUE(KOKBF$),3,4,2))
 
25 rows selected.


脚注の凡例

脚注1:

このグラフは、リポジトリ構造を定義するハード・リンクによって定義され、ハード・リンクを使用した循環は許可されません。ただし弱いリンクを使用して循環を導入できます。「ハード・リンクおよび弱いリンク」を参照してください。


脚注2:

リポジトリの/dbfsフォルダでは、DBFSコンテンツにプロトコルでアクセスできます。DBFSの詳細は、『Oracle Database SecureFilesおよびラージ・オブジェクト開発者ガイド』を参照してください。