この章では、Oracle XML DB Repositoryのデータへのアクセスに使用する事前定義のパブリック・ビューRESOURCE_VIEW
およびPATH_VIEW
について説明します。リソースのパス名に基づく問合せに使用するSQL関数under_path
とequals_path
、およびリソースのパス名と深さを戻すpath
とdepth
についても説明します。
この章の内容は次のとおりです。
関連項目:
|
図25-1に、Oracle XML DBのRESOURCE_VIEW
およびPATH_VIEW
が、SQLを使用してOracle XML DBリポジトリに格納されているデータにアクセスするメカニズムを提供する方法を示します。FTPやWebDAVなどのプロトコルまたはApplication Program Interface(API)を使用してリポジトリに格納されたデータには、RESOURCE_VIEW
およびPATH_VIEW
の値を使用してSQLでアクセスできます。
RESOURCE_VIEW
は、問合せ可能なリソース名を含むリソース(それ自体はXMLType
)、ACLおよびプロパティ(静的または拡張可能)で構成されます。
リソースを構成するコンテンツがXMLType
表またはビュー内に格納されているXMLである場合、RESOURCE_VIEW
はそのコンテンツを格納するXMLType
行を指します。
コンテンツがXMLではない場合、RESOURCE_VIEW
はそれをLOBとして格納します。
フォルダ間の親子関係(階層を構築するために必要です)は、リポジトリの階層索引を使用して効率的に保持および検索されます。テキスト索引はリソースのプロパティの検索に使用でき、名前およびACLに対する内部Bツリー索引によって、リソースXMLType
のこれらの属性に対するアクセスが高速化されます。
RESOURCE_VIEW
とPATH_VIEW
をPL/SQLパッケージDBMS_XDB
とともに使用すると、Oracle XML DBへの問合せベースのアクセス、およびAPIを使用して利用可能なすべてのDML機能が提供されます。
RESOURCE_VIEW
の実表はXDB.XDB$RESOURCE
です。この表はRESOURCE_VIEW
またはDBMS_XDB
APIを介してのみアクセスできます。
図25-1 RESOURCE_VIEWおよびPATH_VIEWを使用したリポジトリ・リソースへのアクセス
PATH_VIEW
には、Oracle XML DBリポジトリのリソースにアクセスするための一意のパスごとに1行が含まれます。各リソースは、リンクともいう複数のパスを持つ場合があります。表25-2に、その構造を示します。
表25-2 PATH_VIEWの構造
列 | データ型 | 説明 |
---|---|---|
|
|
リポジトリ・リソース |
|
|
列 |
|
|
リンクのプロパティ |
|
|
リソースOID |
図25-2にRESOURCE_VIEW
とPATH_VIEW
の構造を示します。
RESOURCE_VIEW
内のパスは任意のパスであり、そのリソースへのアクセスに使用できるパスのいずれかです。Oracle XML DBは、SQL関数under_path
を提供します。この演算子によって、アプリケーションで、特定のフォルダ内のリソースを再帰的に検索したり、リソースの深さを取得したりできます。PATH_VIEW
およびRESOURCE_VIEW
の列内の各行は、XMLType
です。リポジトリ・ビュー上でDMLを使用すると、リソースのプロパティおよびコンテンツの挿入、名前の変更、削除および更新ができます。既存のリソースへのリンクの作成などの一部の操作には、プログラムAPIを使用する必要があります。
RESOURCE_VIEW
のANY_PATH
列およびPATH_VIEW
のPATH
列のパス名は、ルートから始まる絶対パスです。
注意: 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
は戻しません。
ビューRESOURCE_VIEW
とPATH_VIEW
の違いは次のとおりです。
PATH_VIEW
は、特定のリソースに対するすべてのパス名を表示します。RESOURCE_VIEW
は、可能なリソースへのパス名の1つを表示します。
PATH_VIEW
は、リンクのプロパティも表示します。
図25-3にRESOURCE_VIEW
とPATH_VIEW
の違いを示します。
多くのインターネット・アプリケーションでは1つのURLがあればリソースにアクセスできるため、RESOURCE_VIEW
は広範囲に適用できます。
PATH_VIEW
には、リンク・プロパティおよびリソース・プロパティが含まれますが、RESOURCE_VIEW
には、リソース・プロパティのみが含まれます。
通常、RESOURCE_VIEW
のメリットは、最適化です。データベースで1つのパスのみが必要であるとされている場合、索引で多くの作業を実行してすべてのアクセス可能なパスを判断する必要がありません。
注意: RESOURCE_VIEW を使用すると、関数under_path またはequals_path を使用してパスを指定する場合に、そのパスが、通常そのリソースを表示するためにRESOURCE_VIEW を使用して選択する任意のパスであるかどうかにかかわらず、リソースが検索されます。 |
under_path
とequals_path
を使用して、次の操作を実行できます。
パス名を指定した場合
リソースまたはそのOIDの取得
パス名で指定されたディレクトリのリスト
リソースの作成
リソースの削除
リソースの更新
SQL関数under_path
または他のSQL関数を含む条件を指定した場合
リソースの更新
リソースの削除
複数のリソースまたはそのOIDの取得
「RESOURCE_VIEWおよびPATH_VIEW SQL関数の使用」とequals_path
を参照してください。
この項では、RESOURCE_VIEW
およびPATH_VIEW
で使用するSQL関数について説明します。
SQL関数under_path
は、Oracle XML DBリポジトリの階層索引を使用して、特定のパスの下に存在するパスを戻します。この索引は、(最も一般的な用途である)パスの検索の際、高速にアクセスできるように設計されています。
ただし、問合せ述語の他の部分の選択性が高い場合、リポジトリを下から上に検索するunder_path
の機能実装を選択できます。この場合、検索が必要になるリンクの数が非常に少ないため、より効率的です。表25-4にunder_path
の構文を示します。
表25-3にSQL関数under_path
のシグネチャに関する詳細を示します。
表25-3 UNDER_PATH SQL関数のシグネチャ
構文 | 説明 |
---|---|
|
リソースが指定されたパスの下に存在するかどうかを判断します。 パラメータ:
|
|
depth引数で検索するレベルの数を制限して、リソースが指定されたパスの下に存在するかどうかを判断します。 パラメータ:
|
|
関連のSQL関数に対してcorrelation引数を指定して、リソースが指定されたパスの下に存在するかどうかを判断します。 パラメータ:
|
|
depth引数で検索するレベルの数を制限し、関連のSQL関数に対してcorrelation引数を指定して、リソースが指定されたパスの下に存在するかどうかを判断します。 パラメータ:
戻されるリソースのpath引数の下には、そのリソースにアクセス可能なパスが1つしか必要ないことに注意してください。 |
SQL関数equals_path
は、特定のパス名を指定したリソースの検索に使用されます。これは、under_path
の深さの制限を0(ゼロ)に指定した場合と機能的に同じです。
equals_path(resource_column, pathname);
パラメータは次のとおりです。
resource_column
はPATH_VIEW
またはRESOURCE_VIEW
のRESOURCE
列の列名または列の別名です。
pathname
は、解決する(絶対)パス名です。このパス名には、ハード・リソース・リンクまたは弱いリソース・リンクが構成要素として含まれます。
図25-5に、equals_path
の完全な構文を示します。
注意: SQL関数equals_path を使用して、リソースパスの等価テストequals_path('/my/path') = 1 を行う必要があります。絶対パスについては、ANY_PATH の等価テストANY_PATH = '/my/path' は行わないでください。 |
SQL関数path
は、指定されたpathname
引数の下にあるリソースの絶対パス名を戻します。RESOURCE_VIEW
のパス列には、常にリソースの絶対パスが含まれることに注意してください。path
の構文は次のとおりです。
path(correlation);
パラメータは次のとおりです。
correlation
は、under_path
を関連のSQL関数(path
および depth
)に関連付けるために使用できる整数です。
注意: 指定されたpathname 引数の下にパスがない場合、NULL 値が現行のパスの出力として戻されます。 |
図25-6に、path
の構文を示します。
次のRESOURCE_VIEW
とPATH_VIEW
の例では、SQL関数under_path
、equals_path
、path
およびdepth
を使用します。
次の例は、Oracle XML DBリポジトリのリポジトリ・パス、リソースおよびリンク・プロパティにアクセスする方法を示します。初めの方の例では、次のパスで指定されたリソースを使用します。
/a/b/c /a/b/c/d /a/e/c /a/e/c/d
例25-1 あるパスの下にあるパスの判別: 相対
この例では、SQL関数path
を使用してパス/a/b
の下の相対パスを取得します。
SELECT path(1) FROM RESOURCE_VIEW WHERE under_path(RES, '/a/b', 1) = 1;
次の結果が戻されます。
PATH(1) ------- c c/d 2 rows selected.
例25-2 あるパスの下にあるパスの判別: 絶対
この例では、ANY_PATH
を使用してパス/a/b
の下の絶対パスを取得します。
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.
例25-3 あるパスの下にないパスの判別
これは例25-2と同じ例ですが、等しい(=
)ものでなく等しくない(!=
)ものを選び出している点が異なります。この問合せはリポジトリ内で、パス/a/b
の下にないすべてのパスを検索します。
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/databaseSummary.xml /sys/log /sys/schemas /sys/schemas/OE /sys/schemas/OE/localhost:8080 . . . 202 rows selected.
例25-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.
例25-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 databaseSummary.xml log schemas schemas/OE schemas/OE/localhost:8080 schemas/PUBLIC schemas/PUBLIC/www.w3.org schemas/PUBLIC/xmlns.oracle.com 14 rows selected.
例25-6 UNDER_PATHを使用したリソース・メタデータの抽出
SELECT ANY_PATH, extract(RES, '/Resource') FROM RESOURCE_VIEW
WHERE under_path(RES, '/sys') = 1;
これによって、次のような結果が戻されます。
ANY_PATH
--------
EXTRACT(RES,'/RESOURCE')
------------------------
/sys/acls
<Resource xmlns="http://xmlns.oracle.com/xdb/XDBResource.xsd">
<CreationDate>2005-02-07T18:31:53.093179</CreationDate>
<ModificationDate>2005-02-07T18:31:55.852963</ModificationDate>
<DisplayName>acls</DisplayName>
<Language>en-US</Language>
<CharacterSet>ISO-8859-1</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>2005-02-07T18:31:55.745970</CreationDate>
<ModificationDate>2005-02-07T18:31:55.745970</ModificationDate>
<DisplayName>all_all_acl.xml</DisplayName>
<Language>en-US</Language>
<CharacterSet>ISO-8859-1</CharacterSet>
<ContentType>text/xml</ContentType>
<RefCount>1</RefCount>
</Resource>
. . .
41 rows selected.
例25-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 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 14 rows selected.
例25-8 リンクおよびリソース情報のPATH_VIEWからの抽出
SELECT PATH, extract(LINK, '/LINK/Name/text()').getstringval(), extract(LINK, '/LINK/ParentName/text()').getstringval(), extract(LINK, '/LINK/ChildName/text()').getstringval(), extract(RES, '/Resource/DisplayName/text()').getstringval() FROM PATH_VIEW WHERE PATH LIKE '/sys%';
これによって、次のような結果が戻されます。
/sys
sys
/
sys
sys
/sys/acls
acls
sys
acls
acls
/sys/acls/all_all_acl.xml
all_all_acl.xml
acls
all_all_acl.xml
all_all_acl.xml
/sys/acls/all_owner_acl.xml
all_owner_acl.xml
acls
all_owner_acl.xml
all_owner_acl.xml
/sys/acls/bootstrap_acl.xml
bootstrap_acl.xml
acls
bootstrap_acl.xml
bootstrap_acl.xml
. . .
42 rows selected.
例25-9 特定の深さまでの、あるパス以下のすべてのパス
SELECT path(1) FROM PATH_VIEW WHERE under_path(RES, 3, '/sys', 1) > 0 ;
これによって、次のような結果が戻されます。
PATH(1) ------- schemas acls log schemas/PUBLIC schemas/PUBLIC/xmlns.oracle.com acls/bootstrap_acl.xml acls/all_all_acl.xml acls/all_owner_acl.xml acls/ro_all_acl.xml schemas/PUBLIC/www.w3.org apps databaseSummary.xml 12 rows selected.
例25-10 EQUALS_PATHを使用した、パスの位置の設定
SELECT ANY_PATH FROM RESOURCE_VIEW WHERE equals_path(RES, '/sys') > 0;
これによって、次の結果が戻されます。
ANY_PATH -------- /sys 1 row selected.
例25-11 指定したリソースのリソースIDの取得
SELECT RESID FROM RESOURCE_VIEW WHERE extract(RES, '/Resource/Dispname') = 'example';
これによって、次のような結果が戻されます。
RESID -------------------------------- F301A10152470252E030578CB00B432B 1 row selected.
例25-12 RESIDからのリソースのパス名の取得
DECLARE
resid_example RAW(16);
path VARCHAR2(4000);
BEGIN
SELECT RESID INTO resid_example FROM RESOURCE_VIEW
WHERE extractValue(RES, '/Resource/DisplayName') = '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.
例25-13 指定したパスの下にあるフォルダ
SELECT ANY_PATH FROM RESOURCE_VIEW WHERE under_path(RES, 1, '/sys') = 1 AND existsNode(RES, '/Resource[@Container="true"]') = 1;
これによって、次のような結果が戻されます。
ANY_PATH -------- /sys/acls /sys/apps /sys/log /sys/schemas 4 rows selected.
例25-14 RESOURCE_VIEWのXMLType表への結合
SELECT ANY_PATH, extract(value(e), '/PurchaseOrder/LineItems').getclobval() FROM purchaseorder e, RESOURCE_VIEW r WHERE extractValue(r.RES, '/Resource/XMLRef') = ref(e) AND ROWNUM < 2;
これによって、次の結果が戻されます。
ANY_PATH
--------------------------------------------------------------------------------
EXTRACT(VALUE(E),'/PURCHASEORDER/LINEITEMS').GETCLOBVAL()
--------------------------------------------------------------------------------
/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.
例25-15 リソースの削除
リーフ・リソースのみを削除するには、DELETE FROM RESOURCE_VIEW
を使用します。
DELETE FROM RESOURCE_VIEW WHERE equals_path(RES, '/public/myfile') = 1';
同じリソースに複数のリンクが設定されている場合、RESOURCE_VIEW
から削除すると、そのリソースのすべてのリンクが削除され、PATH_VIEW
から削除すると、指定したパスのリンクのみが削除されます。
例25-16 リソースへのリンクの削除
たとえば、'/home/myfile1'
が'/public/myfile'
へのリンクだとします。
CALL DBMS_XDB.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;
DELETE
DML演算子は、空でないフォルダに対しては使用できません。空でないフォルダを削除する場合、先にフォルダの内容を削除してから、空になったフォルダを削除する必要があります。この規則は、ターゲット・フォルダに含まれるすべてのフォルダにも再帰的に適用されます。
ただし、WHERE
句から戻されたパスの順序は保証されません。また、DELETE
演算子では、table式の副次句でORDER BY
句を使用できません。このため、次のことはできません。
DELETE FROM (SELECT 1 FROM RESOURCE_VIEW WHERE under_path(RES, '/public', 1) = 1 ORDER BY depth(1) DESCENDING);
例25-17は、空でないフォルダの削除方法を示しています。
例25-17 空でないフォルダの削除
この例では、フォルダexample
が、サブフォルダexample1
とともに削除されています。
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 existsNode(RES, '/Resource[Owner="US1"]') = 1 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
注意: この場合も、複数の行に対して操作を行う場合、同時トランザクションでのデッドロックが発生しないように注意する必要があります。 |
例25-18 リソースの更新
この例は、パス/test/HR/example/paper
のリソースを変更します。これは、更新前の完全なリソースです。
SELECT r.RES.getCLOBVal()
FROM RESOURCE_VIEW r WHERE equals_path(r.RES, '/test/HR/example/paper') = 1;
R.RES.GETCLOBVAL()
--------------------------------------------------------------------------------
<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>ISO-8859-1</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要素はすべてリソースのmetadata要素です。ただしContents
は例外で、コンテンツを含んでいます。
このUPDATE
文は、DisplayName
メタデータ要素を更新します。
UPDATE RESOURCE_VIEW r SET r.RES = updateXML(r.RES, '/Resource/DisplayName/text()', 'My New Paper') WHERE equals_path(r.RES, '/test/HR/example/paper') = 1; 1 row updated. SELECT r.RES.getCLOBVal() FROM RESOURCE_VIEW r WHERE equals_path(r.RES, '/test/HR/example/paper') = 1; R.RES.GETCLOBVAL() -------------------------------------------------------------------------------- <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.
デフォルトでは、DisplayName
要素のコンテンツpaper
は、リソース・パス/test/HR/example/paper
の最後のロケーション・ステップと同じテキストだったことに注意してください。ただし、これはデフォルト値にすぎません。DisplayName
はリソース・パスからは独立なので、更新してもパスは変わりません。
要素DisplayName
はWebDAV標準によって定義されていて、WebDAVアプリケーションにより認識されています。FTPクライアントなど、WebDAVベースでないアプリケーションは、リソースのDisplayName
を認識しません。FTPクライアントは、UPDATE
操作の後であっても、(たとえばFTPコマンドls
を使用して)リソースをpaper
としてリストします。
例25-19 PATH_VIEW内のパスの更新
この例では、リソースのパスを/test/HR/example/paper
から/test/myexample
に変更します。UnixおよびLinuxのコマンドmv /test/HR/example/paper /test/myexample
を使用するのに類似しています。
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.
関連項目: RESOURCE_VIEW とPATH_VIEW に適用されるSQL関数を使用する、この他の例は表21-3「Oracle XML DBリポジトリへのアクセス: APIオプション」を参照してください。 |
表21-3 に示されていたリポジトリ操作は通常、1回につき1つのリソースにのみ適用されます。複数のOracle XML DBリソースに同じ操作を実行するか、または一連の特定基準を満たす1つ以上のOracle XML DBリソースを検索するには、SQLでRESOURCE_VIEW
およびPATH_VIEW
を使用します。
たとえば、次の操作を実行できます。
例25-20 属性に基づいたリソースの更新
UPDATE RESOURCE_VIEW
SET RES = updateXML(RES, '/Resource/DisplayName/text()', 'My New Paper')
WHERE extractValue(resource, '/Resource/DisplayName') = 'My Paper';
SELECT ANY_PATH FROM RESOURCE_VIEW
WHERE extractValue(RES, '/Resource/DisplayName') = 'My New Paper';
ANY_PATH
---------------
/test/myexample
1 row selected.
例25-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/XDBFolderListing.xsd /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/ftplog.xsd /sys/schemas/PUBLIC/xmlns.oracle.com/xdb/log/httplog.xsd /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.
例25-22 リソースのコピー
このSQL DML文は、フォルダpublic
内のすべてのリソースを、フォルダnewlocation
にコピーします。UnixおよびLinuxのコマンドcp /public/* /newlocation
を使用するのに類似しています。ターゲット・フォルダnewlocation
は、コピー以前に存在している必要があります。
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.
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
要素を大きくすると有効な場合があります。
拡張可能オプティマイザは、SQL関数under_path
およびequals_path
をドメイン索引スキャンによって評価するか、機能実装によって評価するかを決定します。最適な問合せ計画を得るには、オプティマイザはOracle XML DBの統計を必要とします。統計を収集するには、データベース・スキーマ(ユーザー・アカウント)XDB
の下にあるOracle XML DBの表とリポジトリの階層索引を、PL/SQLパッケージDBMS_STATS
を使用して分析します。
次の要素に対するデフォルトの制限は、あまり厳しくありません。制限を超えると、システムが自動的に適応します。
xdbcore-loadableunit-size
- この要素は、ロード可能ユニット(パーティション)の増加可能最大サイズをKBで示します。パーティションがメモリーに読み取られる場合、または新規ドキュメントの使用時にパーティションが作成される場合、そのパーティションは最大サイズに達するまで作成されます。デフォルト値は、16KBです。
xdbcore-xobmem-bound
- この要素は、1つのドキュメントが占有できる最大メモリーをKBで示します。デフォルト値は、1024KBです。ドキュメントがこの数値を超えると、一部のロード可能ユニット(パーティション)のスワッピングが行われます。
データベース・スキーマXDB
の表XDB$RESOURCE
は、リポジトリ・リソースに対応するメタデータおよびデータを格納します。RESOURCE_VIEW
またはPATH_VIEW
でSQL関数contains
を使用して、特定のキーワードを含むリソースを検索できます。
例25-23 「Paper」を含むすべてのリソースの検索
SELECT PATH FROM PATH_VIEW WHERE contains(RES, 'Paper') > 0; PATH ----------------------- /newlocation/myexample /test/myexample 2 rows selected.
例25-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.
このような問合せを評価するには、まずXDB$RESOURCE
表にConText索引を作成する必要があります。Oracle XML DBに格納されたドキュメント・タイプに応じて次のいずれかのオプションを選択して、ConText索引を作成します。
Oracle XML DBがXML文書のみを含む場合、つまり、バイナリ・データを含まない場合は、通常のConText索引をXDB$RESOURCE
表に作成できます。例25-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()
を使用して、ジョブ・キューを使用した索引の自動同期化を構成できます。