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

前
次

24 RESOURCE_VIEWおよびPATH_VIEWを使用したリポジトリへのアクセス

事前定義されたパブリック・ビューRESOURCE_VIEWおよびPATH_VIEWは、Oracle XML DBリポジトリ・データへのアクセスを提供します。Oracle SQL関数under_pathおよびequals_pathを使用すると、リソースのパス名に基づいてリソースを問い合せることができ、関数pathdepthを使用すると、リソース・パス名と深さを戻すことができます。

関連項目:

  • ビューPATH_VIEWの詳細は、『Oracle Databaseリファレンス』を参照してください。

  • ビューRESOURCE_VIEWの詳細は、『Oracle Databaseリファレンス』を参照してください。

24.1 Oracle XML DBのRESOURCE_VIEWとPATH_VIEWの概要

パブリック・ビューRESOURCE_VIEWおよびPATH_VIEWでは、SQLを使用してOracle XML DBリポジトリに格納されたデータにアクセスするためのメカニズムが提供されます。これらのビューを使用すると、FTPやWebDAVなどのインターネット・プロトコルまたはApplication Program Interface (API)を使用して、リポジトリに格納されたデータにアクセスできます。

図24-1では、これを説明しています。

RESOURCE_VIEWは、リソース名を含むリソース(それ自体はXMLTypeインスタンス)、ACLおよびプロパティ(静的または拡張可能)で構成されます。

  • リソースのコンテンツがXMLType表またはビュー内に格納されているXMLデータである場合、RESOURCE_VIEWはそのコンテンツを格納するXMLType行を指します。

  • リソースのコンテンツがXMLデータではない場合、RESOURCE_VIEWはそのコンテンツをLOBとして格納します。

注意:

Oracle Database リリース11.2.0.1.0以降では、表内にLOBとして格納されるリポジトリ・コンテンツは、SecureFiles LOB記憶域を使用します。それより前は、BasicFiles LOB記憶域を使用していました。

フォルダ間の親子関係は、リポジトリの階層索引を使用して効率的に保持および検索されます。テキスト索引はリソースのプロパティの検索に使用でき、名前およびACLに対する内部Bツリー索引によって、リソースXMLTypeデータのこれらの属性に対するアクセスが高速化されます。

RESOURCE_VIEWPATH_VIEWをPL/SQLパッケージDBMS_XDB_REPOSとともに使用すると、Oracle XML DBへの問合せベースのアクセス、およびAPIを使用して利用可能なすべてのDML機能が提供されます。

RESOURCE_VIEWの実表はXDB.XDB$RESOURCEです。この表にアクセスするには、RESOURCE_VIEWまたはPL/SQLパッケージDBMS_XDB_REPOSのみを使用してください。

図24-1 RESOURCE_VIEWおよびPATH_VIEWを使用したリポジトリ・リソースへのアクセス

図24-1の説明が続きます
「図24-1 RESOURCE_VIEWおよびPATH_VIEWを使用したリポジトリ・リソースへのアクセス」の説明

図24-2RESOURCE_VIEWPATH_VIEWの構造を示します。

図24-2 RESOURCE_VIEWとPATH_VIEWの構造

図24-2の説明が続きます
「図24-2 RESOURCE_VIEWとPATH_VIEWの構造」の説明

注意:

ルート・フォルダ(/)リソースは、RESOURCE_VIEWPATH_VIEWのいずれにも含まれません。他のリポジトリ・リソースはすべて含まれます。

RESOURCE_VIEW内のパスは、指定されたリソースへのアクセスに使用できる、いずれかの任意のパスです。Oracle SQL関数under_pathでは、アプリケーションで特定のフォルダ内のリソースを再帰的に検索したり、リソースの深さを取得したりできます。PATH_VIEWおよびRESOURCE_VIEWの列内の各行は、XMLTypeデータ型です。リポジトリ・ビュー上でDMLを使用すると、リソースのプロパティおよびコンテンツの挿入、名前の変更、削除および更新ができます。既存のリソースへのリンクの作成などの一部の操作には、プログラムAPIを使用する必要があります。

RESOURCE_VIEWANY_PATH列およびPATH_VIEWPATH列のパスは絶対パスで、ルートから始まります。

注意:

Oracle SQL関数equals_pathを使用して、リソースパスの等価テストequals_path('/my/path') = 1を行ってください。絶対パスについては、ANY_PATHの等価テストANY_PATH = '/my/path'行わないでください

path関数で戻されるパスは、関数under_pathによって指定されたパス名の下にある相対パスです。たとえば、パス名/a/b/c/a/dがそれぞれ指している2つのリソースがある場合、フォルダ/aの下にあるパスを取得するpath式は、相対パスb/cおよびdを戻します。

同じリソースに対するハード・リンクが複数ある場合は、関数under_pathによって指定されたパス名の下にあるパスのみが戻されます。/a/b/c/a/b/dおよび/a/eがすべて同じリソースへのリンクの場合、/a/bの下にあるすべてのパスを取得するPATH_VIEWの問合せは、/a/b/cおよび/a/b/dのみを戻し、/a/eは戻しません。

24.1.1 RESOURCE_VIEWの定義および構造

パブリック・ビューRESOURCE_VIEWには、Oracle XML DBリポジトリの各リソースに対して1つの行が含まれます(ルート・フォルダ・リソースを除く)。

表24-1では、RESOURCE_VIEWの構造について説明します。

表24-1 RESOURCE_VIEWの構造

データ型 説明

RES

XMLType

リポジトリ内のリソース(ルート・フォルダ・リソースを除く)

ANY_PATH

VARCHAR2

リソースへの(絶対)パス

RESID

RAW

リソースのOID。リソースの一意のハンドル。

24.1.2 PATH_VIEWの定義および構造

パブリック・ビューPATH_VIEWには、Oracle XML DBリポジトリのリソースにアクセスする一意のパスごとに1行が含まれます(ルート・フォルダ・リソースを除く)。各リソースには、リンクとも呼ばれる複数のパスが含まれる場合があります。

表24-2では、PATH_VIEWの構造について説明します。

表24-2 PATH_VIEWの構造

データ型 説明

PATH

VARCHAR2

リポジトリ・リソースRESへの(絶対)パス

RES

XMLType

PATHにより参照されるリソース

LINK

XMLType

リンクのプロパティ

RESID

RAW

リソースOID

24.1.3 RESOURCE_VIEWとPATH_VIEWとの違い

PATH_VIEWには、特定のリソースに対するすべてのパス名が含まれます。RESOURCE_VIEWには、リソースに対する可能なパス名のうちの1つが含まれます。PATH_VIEWには、リンク・プロパティも含まれます。パフォーマンスを高めるには、可能なかぎりPATH_VIEWではなくRESOURCE_VIEWを使用します。

図24-3に、この違いを示します。

多くのインターネット・アプリケーションでは1つのURLがあればリソースにアクセスできるため、RESOURCE_VIEWは広範囲に適用できます。

PATH_VIEWには、リンク・プロパティとリソース・プロパティの両方が含まれますが、RESOURCE_VIEWには、リソース・プロパティのみが含まれます。

PATH_VIEWを使用すると、複数のパスの情報が処理されるため、アクセスに時間がかかることがあります。RESOURCE_VIEWを使用すると、データベースでは、必要なパスが1つのみであるという事実を活用して、使用可能なすべてのパスを索引で判断する作業を軽減できます。

注意:

RESOURCE_VIEWを使用するとき、関数under_pathまたはequals_pathを使用してパスを指定した場合は、指定されたパスが、そのリソースに対してRESOURCE_VIEWを使用した場合に通常表示するものとして選択した任意のパスであるかどうかに関係なく、関数によってリソースが検索されます。

図24-3 RESOURCE_VIEWとPATH_VIEWの解説

図24-3の説明が続きます
「図24-3 RESOURCE_VIEWおよびPATH_VIEWの解説」の説明

24.1.4 UNDER_PATHおよびEQUALS_PATHを使用して実行できる操作

Oracle SQL関数under_pathおよびequals_pathを使用して、リソースまたはそのOIDを取得したり、リソースを作成、削除または更新したり、パス名に対応するディレクトリをリストできます。

  • パス名を指定した場合、次のことができます。

    • リソースまたはそのOIDの取得

    • パス名で指定されたディレクトリのリスト

    • リソースの作成

    • リソースの削除

    • リソースの更新

  • under_pathまたは他のSQL関数を使用する条件を指定した場合、次のことができます。

    • リソースの更新

    • リソースの削除

    • 複数のリソースまたはそのOIDの取得

24.2 RESOURCE_VIEWおよびPATH_VIEWを使用するOracle SQL関数

パブリック・ビューRESOURCE_VIEWおよびPATH_VIEWで使用されるOracle SQL関数には、under_pathequals_pathpathおよびdepthが含まれます。

24.2.1 UNDER_PATH SQL関数

Oracle SQL関数under_pathは、Oracle XML DBリポジトリの階層索引を使用して、特定のパスの下に存在するすべてのハード・リンクのパスを戻します。この索引は、(最も一般的な用途である)パスの検索の際、高速にアクセスできるように設計されています。

ただし、問合せ述語の他の部分の選択性が高い場合、リポジトリを下から上に検索するunder_pathの機能実装を選択できます。この場合、検索が必要なリンクの数が少なくなるため、より効率的です。図24-4under_pathの構文を示します。

表24-3にOracle SQL関数under_pathのシグネチャに関する詳細を示します。

表24-3 UNDER_PATH SQL関数のシグネチャ

構文 説明
under_path(resource_column, pathname); 

リソースが指定されたパスの下に存在するかどうかを判断します。

パラメータ:

  • resource_column: PATH_VIEWまたはRESOURCE_VIEWRESOURCE列の列名または列の別名。

  • pathname: 解決するパス名。

under_path(resource_column, depth, pathname);

depth引数で検索するレベルの数を制限して、リソースが指定されたパスの下に存在するかどうかを判断します。

パラメータ:

  • resource_column: PATH_VIEWまたはRESOURCE_VIEWRESOURCE列の列名または列の別名

  • depth: 検索する深さの最大値。負でない整数。

  • pathname: 解決するパス名。

under_path(resource_column, pathname, correlation);

関連のSQL関数に対してcorrelation引数を指定して、リソースが指定されたパスの下に存在するかどうかを判断します。

パラメータ:

  • resource_column: PATH_VIEWまたはRESOURCE_VIEWRESOURCE列の列名または列の別名

  • pathname: 解決するパス名。

  • correlation: under_pathを関連のSQL関数(pathおよびdepth)に関連付けるために使用できる整数。

under_path(resource_column, depth, pathname, correlation);

depth引数で検索するレベルの数を制限し、関連のSQL関数に対してcorrelation引数を指定して、リソースが指定されたパスの下に存在するかどうかを判断します。

パラメータ:

  • resource_column: PATH_VIEWまたはRESOURCE_VIEWRESOURCE列の列名または列の別名。

  • depth: 検索する深さの最大値。負でない整数。

  • pathname: 解決するパス名。

  • correlation: under_pathを関連のSQL関数(pathおよびdepth)に関連付けるために使用できる整数。

戻されるリソースのpathname引数の下には、そのリソースにアクセス可能なパスが1つしか必要ないことに注意してください。このようなパスが引数pathnameの下にない場合は、NULL値が戻されます。

注意:

このような検索は循環する場合があるため、関数under_pathが弱いリンクの後に続くことはありません。under_pathに対する弱いリンクの引数は正しく解決されますが、そのパスのリソースを検索する場合、弱いリンクの後に続くことはありません。

24.2.2 EQUALS_PATH SQL関数

Oracle SQL関数equals_pathを使用して、指定されたパス名を含むリソースを検索します。これはunder_pathの深さの制約がゼロの場合と機能的に同等です。

equals_path(resource_column, pathname);

パラメータは次のとおりです。

  • resource_columnPATH_VIEWまたはRESOURCE_VIEWRESOURCE列の列名または列の別名です。

  • pathnameは、解決する(絶対)パス名です。このパス名には、ハード・リソース・リンクまたは弱いリソース・リンクが構成要素として含まれます。

図24-5に、equals_pathの完全な構文を示します。

注意:

  • Oracle SQL関数equals_pathを使用して、リソースパスの等価テストequals_path('/my/path') = 1を行ってください。絶対パスについては、ANY_PATHの等価テストANY_PATH = '/my/path'行わないでください

  • ハードコードされた文字列ではなく、バインド変数をequals_pathとともに使用してください。

24.2.3 PATH SQL関数

Oracle SQL関数pathは、指定されたpathname引数の下にあるリソースの相対パス名を、関数under_pathまたはequal_pathに戻します。

RESOURCE_VIEWのパス列には、常にリソースの絶対パスが含まれます。関数pathの構文は、次のとおりです。

path(correlation);

パラメータは次のとおりです。

  • correlationは、pathをunder_pathまたはequals_pathに関連付けるために使用できる整数です。

図24-6に、関数pathの構文を示します。

24.2.4 DEPTH SQL関数

Oracle SQL関数depthは指定された起動パスの下にあるリソースのフォルダ階層を戻します。

depth(correlation);

パラメータは次のとおりです。

correlationは、depthをunder_pathまたはequals_pathを持つpathに関連付けるために使用できる整数です。

24.3 リポジトリ・データ・パス、リソースおよびリンクへのアクセス: 例

ここでの例は、Oracle XML DBリポジトリ・パス、リソースおよびリンク・プロパティにアクセスする方法を示しています。

初めの方の例では、次のパスで指定されたリソースを使用します。

/a/b/c
/a/b/c/d
/a/e/c
/a/e/c/d

例24-1では、Oracle SQL関数pathを使用してパス/a/bの下の相対パスを取得します。

例24-2では、ANY_PATHを使用してパス/a/bの下の絶対パスを取得します。

例24-3例24-2と同じ例ですが、等しい(=)ものでなく等しくない(!=)ものを選び出している点が異なります。例24-3の問合せでは、リポジトリ内でパス/a/bの下にないすべてのパスを検索します。

例24-4に、リポジトリのa/bフォルダおよび/a/eフォルダの下位の相対パスをそれぞれ示します。式path(1)は、a/bフォルダを指定している式under_path(RES, '/a/b', 1)と同じcorrelation番号1を使用しているので、a/bフォルダの下位のパスを表します。path(2)/a/eフォルダについても同様です。式ANY_PATHは、対応する絶対パスを戻します。

例24-1 あるパスの下にあるパスの判別: 相対

SELECT path(1) FROM RESOURCE_VIEW WHERE under_path(RES, '/a/b', 1) = 1;
PATH(1)
-------
c
c/d

2 rows selected.

例24-2 あるパスの下にあるパスの判別: 絶対

SELECT ANY_PATH FROM RESOURCE_VIEW WHERE under_path(RES, '/a/b') = 1;
ANY_PATH
--------
/a/b/c
/a/b/c/d

2 rows selected.

例24-3 あるパスの下にないパスの判別

SELECT ANY_PATH FROM RESOURCE_VIEW WHERE under_path(RES, '/a/b') != 1
ANY_PATH
--------
/a
/a/b
/a/e
/a/e/c
/a/e/c/d
/home
/home/OE
/home/OE/PurchaseOrders
/home/OE/PurchaseOrders/2002
/home/OE/PurchaseOrders/2002/Apr
/home/OE/PurchaseOrders/2002/Apr/AMCEWEN-20021009123336171PDT.xml
/home/OE/PurchaseOrders/2002/Apr/AMCEWEN-20021009123336271PDT.xml
/home/OE/PurchaseOrders/2002/Apr/EABEL-20021009123336251PDT.xml
. . .
/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/apps/plsql
/sys/apps/plsql/xs
/sys/apps/plsql/xs/netaclrc.xml
/sys/apps/plsql/xs/netaclsc.xml
/sys/databaseSummary.xml
/sys/log
/sys/schemas
/sys/schemas/OE
/sys/schemas/OE/localhost:8080
. . .

326 rows selected.

例24-4 複数のcorrelationを使用したパスの判別

SELECT ANY_PATH, path(1), path(2) 
  FROM RESOURCE_VIEW
  WHERE under_path(RES, '/a/b', 1) = 1 OR under_path(RES, '/a/e', 2) = 1;
ANY_PATH   PATH(1)  PATH(2)
---------- -------- --------
/a/b/c     c
/a/b/c/d   c/d
/a/e/c              c
/a/e/c/d            c/d
 
4 rows selected.

例24-5 3レベルのリソースの相対パス名

SELECT path(1) FROM RESOURCE_VIEW WHERE under_path(RES, 3, '/sys', 1) = 1;

これによって、次のような結果が戻されます。

PATH(1)
-------
acls
acls/all_all_acl.xml
acls/all_owner_acl.xml
acls/bootstrap_acl.xml
acls/ro_all_acl.xml
apps
apps/plsql
apps/plsql/xs
databaseSummary.xml
log
schemas
schemas/OE
schemas/OE/localhost:8080
schemas/PUBLIC
schemas/PUBLIC/www.w3.org
schemas/PUBLIC/xmlns.oracle.com
 
93 rows selected.

例24-6 UNDER_PATHを使用したリソース・メタデータの抽出

SELECT ANY_PATH,
       XMLQuery('declare namespace ns = "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                 $r/ns:Resource' PASSING RES AS "r" RETURNING CONTENT)
  FROM RESOURCE_VIEW WHERE under_path(RES, '/sys') = 1;
 

これによって、次のような結果が戻されます。

ANY_PATH
--------
XMLQUERY('DECLARENAMESPACENS="HTTP://XMLNS.ORACLE.COM/XDB/XDBRESOURCE.XSD";(::)$
--------------------------------------------------------------------------------
/sys/acls
<Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd">
  <CreationDate>2008-06-25T13:17:45.164662</CreationDate>
  <ModificationDate>2008-06-25T13:17:47.865163</ModificationDate>
  <DisplayName>acls</DisplayName>
  <Language>en-US</Language>
  <CharacterSet>UTF-8</CharacterSet>
  <ContentType>application/octet-stream</ContentType>
  <RefCount>1</RefCount>
</Resource>
 
/sys/acls/all_all_acl.xml
<Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd">
  <CreationDate>2008-06-25T13:17:47.759806</CreationDate>
  <ModificationDate>2008-06-25T13:17:47.759806</ModificationDate>
  <DisplayName>all_all_acl.xml</DisplayName>
  <Language>en-US</Language>
  <CharacterSet>UTF-8</CharacterSet>
  <ContentType>text/xml</ContentType>
  <RefCount>1</RefCount>
</Resource>
. . .
41 rows selected.

例24-7 関数PATHとDEPTHのPATH_VIEWでの使用

SELECT path(1) path, depth(1) depth FROM PATH_VIEW 
  WHERE under_path(RES, 3, '/sys', 1) = 1;
 

これによって、次のような結果が戻されます。

PATH                                      DEPTH
----                                      -----
acls                                      1
acls/all_all_acl.xml                      2
acls/all_owner_acl.xml                    2
acls/bootstrap_acl.xml                    2
acls/ro_all_acl.xml                       2
apps                                      1
apps/plsql                                2
apps/plsql/xs                             3
databaseSummary.xml                       1
log                                       1
schemas                                   1
schemas/OE                                2
schemas/OE/localhost:8080                 3
schemas/PUBLIC                            2
schemas/PUBLIC/www.w3.org                 3
schemas/PUBLIC/xmlns.oracle.com           3
. . .

例24-8 リンクおよびリソース情報のPATH_VIEWからの抽出

SELECT PATH, 
       XMLCast(XMLQuery(
                 'declare namespace ns =
                           "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                  $l/ns:LINK/ns:Name' PASSING LINK AS "l" RETURNING CONTENT)
               AS VARCHAR2(256)),
       XMLCast(XMLQuery(
                 'declare namespace ns =
                           "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                  $l/ns:LINK/ns:ParentName' PASSING LINK AS "l" RETURNING CONTENT)
               AS VARCHAR2(256)),
       XMLCast(XMLQuery(
                 'declare namespace ns =
                           "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                  $l/ns:LINK/ns:ChildName' PASSING LINK AS "l" RETURNING CONTENT)
               AS VARCHAR2(256)),
       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(128))
  FROM PATH_VIEW WHERE PATH LIKE '/sys%';

これによって、次のような結果が戻されます。

/sys/schemas/PUBLIC/www.w3.org/1999/xlink.xsd
xlink.xsd
 
/sys/schemas/PUBLIC/www.w3.org/1999/xlink
xlink
 
/sys/schemas/PUBLIC/www.w3.org/1999/csx.xlink.xsd
csx.xlink.xsd

. . .

118 rows selected.

例24-9 特定の深さまでの、あるパス以下のすべてのリポジトリ・パス

SELECT path(1) FROM PATH_VIEW WHERE under_path(RES, 3, '/sys', 1) > 0;

これによって、次のような結果が戻されます。

PATH(1)
-------
acls
acls/all_all_acl.xml
acls/all_owner_acl.xml
acls/bootstrap_acl.xml
acls/ro_all_acl.xml
apps
apps/plsql
apps/plsql/xs
databaseSummary.xml
log
principals
principals/groups
principals/users
schemas
schemas/PUBLIC
schemas/PUBLIC/www.opengis.net
schemas/PUBLIC/www.w3.org
schemas/PUBLIC/xmlns.oracle.com
workspaces
. . .
 
43 rows selected.

例24-10 EQUALS_PATHを使用したリポジトリ・パスの特定

SELECT ANY_PATH FROM RESOURCE_VIEW WHERE equals_path(RES, '/sys') > 0;
ANY_PATH
--------
/sys
 
1 row selected.

例24-11 指定したリソースのリソースIDの取得

SELECT RESID 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(128))
        = 'example';

これによって、次のような結果が戻されます。

RESID
--------------------------------
F301A10152470252E030578CB00B432B
 
1 row selected.

例24-12 RESIDからのリソースのパス名の取得

DECLARE
  resid_example RAW(16);
  path          VARCHAR2(4000);
BEGIN
  SELECT RESID INTO resid_example 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(128))
 
          = 'example';
  SELECT ANY_PATH INTO path FROM RESOURCE_VIEW WHERE RESID = resid_example;
  DBMS_OUTPUT.put_line('The path is: ' || path);
END;
/
The path is: /public/example
 
PL/SQL procedure successfully completed.

例24-13 指定したパスの下にあるフォルダ

SELECT ANY_PATH FROM RESOURCE_VIEW
  WHERE under_path(RES, 1, '/sys') = 1
    AND XMLExists('declare namespace ns = 
                     "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                   $r/ns:Resource[@Container = xs:boolean("true")]'
                  PASSING RES AS "r");

これによって、次のような結果が戻されます。

ANY_PATH
--------
/sys/acls
/sys/apps
/sys/log
/sys/schemas
 
4 rows selected.

例24-14 RESOURCE_VIEWのXMLType表への結合

SELECT ANY_PATH, XMLQuery('$p/PurchaseOrder/LineItems'
                          PASSING po.OBJECT_VALUE AS "p" RETURNING CONTENT)
  FROM purchaseorder po, RESOURCE_VIEW rv
  WHERE 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 ROWNUM < 2;
 
ANY_PATH
--------------------------------------------------------------------------------
XMLQUERY('$P/PURCHASEORDER/LINEITEMS'PASSINGPO.OBJECT_VALUEAS"P"RETURNINGCONTENT
--------------------------------------------------------------------------------
/home/OE/PurchaseOrders/2002/Apr/AMCEWEN-20021009123336171PDT.xml
<LineItems>
  <LineItem ItemNumber="1">
    <Description>Salesman</Description>
    <Part Id="37429158920" UnitPrice="39.95" Quantity="2"/>
  </LineItem>
  <LineItem ItemNumber="2">
    <Description>Big Deal on Madonna Street</Description>
    <Part Id="37429155424" UnitPrice="29.95" Quantity="1"/>
  </LineItem>
  <LineItem ItemNumber="3">
    <Description>Hearts and Minds</Description>
    <Part Id="37429166321" UnitPrice="39.95" Quantity="1"/>
  </LineItem>

. . .

  <LineItem ItemNumber="23">
    <Description>Great Expectations</Description>
    <Part Id="37429128022" UnitPrice="39.95" Quantity="4"/>
  </LineItem>
</LineItems>
 
1 row selected.

24.4 リポジトリ・リソースの削除: 例

ここでの例は、Oracle XML DBリポジトリのリソースおよびパスを削除する方法を示しています。

リーフ・リソースのみを削除するには、例24-15のようにDELETE FROM RESOURCE_VIEWを使用します。

同じリソースへの複数のリンクの場合、RESOURCE_VIEWから削除すると、リソースはそのリンクすべてとともに削除されます。PATH_VIEWから削除すると、指定したパスのリンクのみが削除されます。

例24-16に、これを示します。

例24-15 リソースの削除

DELETE FROM RESOURCE_VIEW WHERE equals_path(RES, '/public/myfile') = 1';
 

例24-16 リソースへのリンクの削除

たとえば、'/home/myfile1''/public/myfile'へのリンクだとします。

CALL DBMS_XDB_REPOS.link('/public/myfile', '/home', 'myfile1');

次のSQL DML文は、パス/home/myfile1に検出されたOracle XML DBリポジトリ内のものを、リンクやリソースも含めすべて削除します。

DELETE FROM RESOURCE_VIEW WHERE equals_path(RES, '/home/myfile1') = 1;

次のDML文は、パス/home/file1リンクのみを削除します。

DELETE FROM PATH_VIEW WHERE equals_path(RES, '/home/file1') = 1;

24.4.1 空でないフォルダ・リソースの削除

DELETE DML演算子は、空でないフォルダに対しては使用できません。空でないフォルダを削除する場合、先にフォルダの内容を削除してから、空になったフォルダを削除する必要があります。この規則は、ターゲット・フォルダに含まれるすべてのフォルダにも再帰的に適用されます。

しかし、WHERE句から戻されるパスの順番は保証されず、DELETE演算子ではその表式の副句でORDER BY句を使用できません。次のことは実行できません

DELETE FROM (SELECT 1 FROM RESOURCE_VIEW
               WHERE under_path(RES, '/public', 1) = 1
               ORDER BY depth(1) DESCENDING);

例24-17は、空でないフォルダの削除方法を示しています。この例では、フォルダexampleが、サブフォルダexample1とともに削除されています。

注意:

この場合も、複数の行に対して操作を行う場合、同時トランザクションでのデッドロックが発生しないように注意する必要があります。

例24-17 空でないフォルダの削除

SELECT PATH FROM PATH_VIEW WHERE under_path(RES, '/home/US1') = 1;
 
PATH
--------------------------
/home/US1/example
/home/US1/example/example1
 
2 rows selected.

DECLARE
  CURSOR c1 IS
    SELECT ANY_PATH p FROM RESOURCE_VIEW
      WHERE under_path(RES, '/home/US1', 1) = 1
        AND XMLExists('declare namespace ns =
                         "http://xmlns.oracle.com/xdb/XDBResource.xsd"; (: :)
                       $r/ns:Resource[ns:Owner="US1"]' PASSING RES AS "r")
      ORDER BY depth(1) DESC;
  del_stmt VARCHAR2(500) :=
    'DELETE FROM RESOURCE_VIEW WHERE equals_path(RES, :1)=1';
BEGIN
  FOR r1 IN c1 LOOP
    EXECUTE IMMEDIATE del_stmt USING r1.p;
  END LOOP;
END;
/
 
PL/SQL procedure successfully completed.
 
SELECT PATH FROM PATH_VIEW WHERE under_path(RES, '/home/US1') = 1;
 
no rows selected

24.5 リポジトリ・リソースの更新例

ここでの例は、Oracle XML DBリポジトリのリソースおよびパスを更新する方法を示しています。

例24-18は、パス/test/HR/example/paperのリソースを変更します。

関連項目:

リソース・メタデータの更新のその他の例は、 ユーザー定義のリポジトリ・メタデータを参照してください。

デフォルトでは、DisplayName要素のコンテンツpaperは、リソース・パス/test/HR/example/paperの最後のロケーション・ステップと同じテキストだったことに注意してください。ただし、これはデフォルト値にすぎません。DisplayNameはリソース・パスからは独立なので、更新してもパスは変わりません。

要素DisplayNameはWebDAV標準によって定義されていて、WebDAVアプリケーションにより認識されています。FTPクライアントなど、WebDAVベースでないアプリケーションは、リソースのDisplayNameを認識しません。FTPクライアントは、UPDATE操作の後であっても、(たとえばFTPコマンドlsを使用して)リソースをpaperとしてリストします。

例24-19では、リソースのパスを/test/HR/example/paperから/test/myexampleへと変更します。これはUNIXまたはLinuxコマンドmv /test/HR/example/paper /test/myexampleの使用に類似しています。

関連項目:

RESOURCE_VIEWおよびPATH_VIEWに適用されるSQL関数を使用するその他の例は、表21-3を参照してください。

例24-18 リソースの更新

これは、更新操作前の完全なリソースです。

SELECT XMLSerialize(DOCUMENT r.RES AS CLOB)
  FROM RESOURCE_VIEW r WHERE equals_path(r.RES, '/test/HR/example/paper') = 1;
 
XMLSERIALIZE(DOCUMENTR.RESASCLOB)
--------------------------------------------------------------------------------
<Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd" Hidden="false" Inv
alid="false" Container="false" CustomRslv="false" VersionHistory="false" StickyR
ef="true">
  <CreationDate>2005-04-29T16:30:01.588835</CreationDate>
  <ModificationDate>2005-04-29T16:30:01.588835</ModificationDate>
  <DisplayName>paper</DisplayName>
  <Language>en-US</Language>
  <CharacterSet>UTF-8</CharacterSet>
  <ContentType>application/octet-stream</ContentType>
  <RefCount>1</RefCount>
  <ACL>
    <acl description="Public:All privileges to PUBLIC" xmlns="http://xmlns.oracl
e.com/xdb/acl.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:sch
emaLocation="http://xmlns.oracle.com/xdb/acl.xsd                           http:
//xmlns.oracle.com/xdb/acl.xsd">
      <ace>
        <principal>PUBLIC</principal>
        <grant>true</grant>
        <privilege>
          <all/>
        </privilege>
      </ace>
    </acl>
  </ACL>
  <Owner>TESTUSER1</Owner>
  <Creator>TESTUSER1</Creator>
  <LastModifier>TESTUSER1</LastModifier>
  <SchemaElement>http://xmlns.oracle.com/xdb/XDBSchema.xsd#binary</SchemaElement
>
  <Contents>
    <binary>4F7261636C65206F7220554E4958</binary>
  </Contents>
</Resource>
 
1 row selected.

ここに示されたすべてのXML要素は、リソースのコンテンツを含むContentsを除き、リソースのメタデータ要素です。

このUPDATE文は、DisplayNameメタデータ要素を更新します。

UPDATE RESOURCE_VIEW r
  SET r.RES =
    XMLQuery('copy $i := $p1 modify
                (for $j in $i/Resource/DisplayName
                 return replace value of node $j with $p2)
              return $i'
             PASSING r.RES AS "p1", 'My New Paper' AS "p2"
             RETURNING CONTENT)
    WHERE equals_path(r.RES, '/test/HR/example/paper') = 1;
 
1 row updated.

SELECT XMLSerialize(DOCUMENT r.RES AS CLOB)
  FROM RESOURCE_VIEW r WHERE equals_path(r.RES, '/test/HR/example/paper') = 1;
 
XMLSERIALIZE(DOCUMENTR.RESASCLOB)
--------------------------------------------------------------------------------
<Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd" Hidden="false" Inv
alid="false" Container="false" CustomRslv="false" VersionHistory="false" StickyR
ef="true">
  <CreationDate>2005-04-29T16:30:01.588835</CreationDate>
  <ModificationDate>2005-04-29T16:30:01.883838</ModificationDate>
  <DisplayName>My New Paper</DisplayName>
  <Language>en-US</Language>

  . . .

  <Contents>
    <binary>4F7261636C65206F7220554E4958</binary>
  </Contents>
</Resource>
 
1 row selected.

例24-19 PATH_VIEW内のパスの更新

SELECT ANY_PATH FROM RESOURCE_VIEW WHERE under_path(RES, '/test') = 1;
 
ANY_PATH
--------
/test/HR
/test/HR/example
/test/HR/example/paper
 
3 rows selected.

UPDATE PATH_VIEW 
  SET PATH = '/test/myexample' WHERE PATH = '/test/HR/example/paper';

ANY_PATH
--------
/test/HR
/test/HR/example
/test/myexample
 
3 rows selected.

24.6 複数のOracle XML DBリソースの操作

複数のOracle XML DBリソースに対して操作を実行するか、または特定の一連の基準を満たす1つ以上のOracle XML DBリソースを検索するには、SQLでRESOURCE_VIEWおよびPATH_VIEWを使用します。

たとえば、次の操作を実行できます。

  • 属性に基づいたリソースの更新 - 例24-20を参照

  • フォルダ内のリソースの検索 - 例24-21を参照

  • 一連のOracle XML DBリソースのコピー - 例24-22を参照

例24-22のSQL DML文では、フォルダpublic内のすべてのリソースをフォルダnewlocationにコピーします。これはUNIXまたはLinuxコマンドcp /public/* /newlocationに類似しています。ターゲット・フォルダnewlocationはコピーの前に存在している必要があります。

例24-20 属性に基づいたリソースの更新

UPDATE RESOURCE_VIEW
  SET RES =
    XMLQuery('copy $i := $p1 modify
                (for $j in $i/Resource/DisplayName
                 return replace value of node $j with $p2)
               return $i'
              PASSING RES AS "p1", 'My New Paper' AS "p2"
              RETURNING CONTENT)
  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(128))
        = 'My Paper';
 
1 row updated.
 
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(128))
          = 'My New Paper';
 
ANY_PATH
---------------
/test/myexample
 
1 row selected.

例24-21 フォルダ内のリソースの検索

SELECT ANY_PATH FROM RESOURCE_VIEW
  WHERE under_path(resource, '/sys/schemas/PUBLIC/xmlns.oracle.com/xdb') = 1;

ANY_PATH
--------------------------------------------------------------
/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/log/xdblog.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/stats.xsd
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/xdbconfig.xsd
 
12 rows selected.

例24-22 リソースのコピー

SELECT PATH FROM PATH_VIEW WHERE under_path(RES, '/test') = 1;
 
PATH
-----------------
/test/HR
/test/HR/example
/test/myexample
 
3 rows selected.
 
INSERT INTO PATH_VIEW
  SELECT '/newlocation/' || path(1), RES, LINK, NULL FROM PATH_VIEW
    WHERE under_path(RES, '/test', 1) = 1
    ORDER BY depth(1);
 
3 rows created.
 
SELECT PATH FROM PATH_VIEW WHERE under_path(RES, '/newlocation') = 1;
 
PATH
------------------------
/newlocation/HR
/newlocation/HR/example
/newlocation/myexample
 
3 rows selected.

24.7 Oracle XML DBリポジトリ操作のパフォーマンス・ガイドライン

リソースの作成や問合せなど、リポジトリ操作のパフォーマンスを高めるためのガイドラインを示します。

フォルダに多数のリソースが含まれる場合、特に多数のリソースを作成または削除するときに、並行性が低下することがあります。一般的に、フォルダに含めるリソースは10,000以下に抑えてください。経験的限界は、データベース・ブロック・サイズとファイル名の平均長によって決まります。

リソースを一括で作成する場合は、少なくとも1,000リソースに1回ずつCOMMIT操作を実行してください。コミットの頻度が高すぎる場合も、1,000リソースの作成ごとに1回より頻度が低い場合も、パフォーマンスが低下することがあります。

既知のXML Schemaに基づく文書であるファイル・リソースを作成する場合、PL/SQLファンクションDBMS_XDB_REPOS.createResourceへのパラメータとしてXML Schema URLを指定します。これにより、文書が事前に解析されてXML Schemaが判別されます。

Oracle XML DBは、システムおよびプロトコル環境の構成に構成ファイルxdbconfig.xmlを使用します。このファイルには、RESOURCE_VIEWキャッシュの動的メモリー内のサイズを定義する要素パラメータresource-view-cache-sizeが含まれています。デフォルト値は、1048576です。

RESOURCE_VIEWおよびPATH_VIEWの問合せは、resource-view-cache-sizeをチューニングすることによってパフォーマンスが向上する場合があります。一般に、キャッシュ・サイズが大きいほど、問合せは高速化します。デフォルトのresource-view-cache-sizeはほとんどの場合に適していますが、大規模なRESOURCE_VIEWを問い合せるときに、resource-view-cache-size要素を大きくすると有効な場合があります。

次の要素に対するデフォルトの制限は、あまり厳しくありません。制限を超えると、システムが自動的に適応します。

  • xdbcore-loadableunit-size: この要素は、ロード可能ユニット(パーティション)の増加可能最大サイズをKBで示します。パーティションがメモリーに読み取られる場合、または新規ドキュメントの使用時にパーティションが作成される場合、そのパーティションは最大サイズに達するまで作成されます。デフォルト値は、16KBです。

  • xdbcore-xobmem-bound: この要素は、1つのドキュメントが占有できる最大メモリーをKBで示します。デフォルト値は、1024KBです。ドキュメントがこの数値を超えると、一部のロード可能ユニット(パーティション)のスワッピングが行われます。

関連項目:

  • Oracle XML DBの管理

  • PL/SQLファンクションDBMS_XDB_REPOS.createResourceの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』を参照してください。

24.8 Oracle Textを使用したリソースの検索

データベース・スキーマXDBの表XDB$RESOURCEは、リポジトリ・リソースに対応するメタデータおよびデータを格納します。RESOURCE_VIEWまたはPATH_VIEWでOracle SQL関数containsを使用して、特定のキーワードを含むリソースを検索できます。

このような問合せを評価するには、まずXDB$RESOURCE表にConText索引を作成する必要があります。Oracle XML DBに格納されたドキュメント・タイプに応じて次のいずれかのオプションを選択して、ConText索引を作成します。

  • Oracle XML DBにXML文書のみが含まれる場合、つまりバイナリ・データが含まれない場合は、通常のContext索引をXDB$RESOURCE表に作成できます。例24-24がその例です。

    CREATE INDEX xdb$resource_ctx_i ON XDB.XDB$RESOURCE(OBJECT_VALUE)
      INDEXTYPE IS CTXSYS.CONTEXT;
  • Oracle XML DBにバイナリ・データが含まれる場合(Microsoft Word文書など)、索引付けの前にこのような文書をフィルタリングするユーザー・フィルタが必要です。Context索引の作成と構成には、パッケージDBMS_XDBT(dbmsxdbt.sql)を使用します。

    -- Install the package - connected as SYS
    @dbmsxdbt
    -- Create the preferences
    EXEC DBMS_XDBT.createPreferences;
    -- Create the index
    EXEC DBMS_XDBT.createIndex;

    関連項目:

パッケージDBMS_XDBTには、索引の同期と最適化に使用するプロシージャも含まれています。プロシージャconfigureAutoSync()を使用し、ジョブ・キューを使用して索引を自動的に同期化できます。

例24-23 「Paper」を含むすべてのリソースの検索

SELECT PATH FROM PATH_VIEW WHERE contains(RES, 'Paper') > 0;

PATH
-----------------------
/newlocation/myexample
/test/myexample
 
2 rows selected.

例24-24 特定のパスの下にあり、「Paper」を含むすべてのリソースの検索

SELECT ANY_PATH FROM RESOURCE_VIEW
   WHERE contains(RES, 'Paper') > 0 AND under_path(RES, '/test') > 0;

ANY_PATH
----------------
/test/myexample
 
1 row selected.