226 DBMS_XMLSTORAGE_MANAGE

DBMS_XMLSTORAGE_MANAGEパッケージは、スキーマ登録の完了後にXML記憶域を管理および変更するためのインタフェースを提供します。

この章のトピックは、次のとおりです:

226.1 DBMS_XMLSTORAGE_MANAGEの概要

DBMS_XMLSTORAGE_MANAGEには、スキーマ登録の完了後にXML記憶域を管理および変更するためのプロシージャが含まれています。

バルク・ロード操作のパフォーマンスを改善するには、このパッケージのサブプログラムを使用してください。バルク・ロード・プロセスを開始する前に索引と制約を無効化し、後でそれらを有効化することができます。

226.2 DBMS_XMLSTORAGE_MANAGEのセキュリティ・モデル

DBMS_XMLSTORAGE_MANAGEパッケージはXDBによって所有されているため、SYSまたはXDBによって作成される必要があります。EXECUTE権限は、PUBLICに付与されます。

このパッケージ内のサブプログラムは、現行のユーザーの権限を使用して実行されます。

226.3 DBMS_XMLSTORAGE_MANAGEサブプログラムの要約

この表は、DBMS_XML_STORAGEパッケージのサブプログラムについて説明しています。

表226-1 DBMS_XMLSTORAGE_MANAGEパッケージのサブプログラム

サブプログラム 説明

DISABLEINDEXESANDCONSTRAINTSプロシージャ

XMLType表およびXMLType列の索引と制約を無効化します。

ENABLEINDEXESANDCONSTRAINTSプロシージャ

すべての索引を再構築し、XMLType表(子表および表外の表も含む)に対して制約を有効化します。

EXCHANGEPOSTPROCプロシージャ

パーティションの交換後に制約を有効化してください。

EXCHANGEPREPROCプロシージャ

パーティションの交換前に制約を無効化してください。

INDEXXMLREFERENCESプロシージャ

指定されたXMLタイプの表のREF列に、または指定された表のXMLタイプの列に、一意の索引を作成します。

REFPARTITIONEXCHANGEINプロシージャ

これは、パーティション交換操作によりデータをパーティション化された表および(子表にローカルxmlindexを持つxmltype列がある場合は)子の参照パーティション表にロードする補助プロシージャです。

REFPARTITIONEXCHANGEOUTプロシージャ

パーティション交換操作によりデータをパーティション化された表および(子表にローカルxmlindexを持つxmltype列がある場合は)子の参照パーティション表からロードする補助プロシージャです。

RENAMECOLLECTIONTABLEプロシージャ

コレクション表の名前を指定された表名に変更します。

SCOPEXMLREFERENCESプロシージャ

すべてのXML参照の有効範囲を指定します。有効範囲を指定したREFタイプは多くの記憶域領域を必要としないため、有効範囲が指定されていないREFタイプよりも効率的にアクセスできます。

XPATH2TABCOLMAPPINGファンクション

パス式を(XPath表記法またはDOT表記法で)対応する表名と列名にマップします。

226.3.1 DISABLEINDEXESANDCONSTRAINTSプロシージャ

このプロシージャは、XMLType表およびXMLType列の索引と制約を無効化します。

構文

DBMS_XMLSTORAGE_MANAGE.DISABLEINDEXESANDCONSTRAINTS (
   owner_name    IN  VARCHAR2 DEFAULT USER, 
   table_name    IN  VARCHAR2, 
   column_name   IN  VARCHAR2 DEFAULT NULL,
   clear         IN  BOOLEAN  DEFAULT FALSE);

パラメータ

表226-2 DISABLEINDEXESANDCONSTRAINTSプロシージャのパラメータ

パラメータ 説明

owner_name

所有者の名前。

table_name

プロシージャが実行されているXMLType表の名前

column_name

XMLType列の名前

clear

TRUEに設定されたときに、プロシージャの実行前に表の格納済索引および制約のデータをすべてクリアするブール値。デフォルトはFALSEで、クリアしません。

使用上のノート

XMLTYPE表の引渡し

XMLType表の場合は、バルク・ロード操作が実行されるXMLType表の名前を渡す必要があります。XMLType列の場合は、リレーショナル表の名前と、対応するXMLType列の名前を渡す必要があります。

索引と制約を有効化および無効化するclearの使用

ノート:

clearTRUEに設定してDISABLEINDEXESANDCONTRAINTSプロシージャをコールした場合、このプロシージャを以前に実行した際に記憶されたXMLTYPEの表または列に関する索引または制約情報がすべて削除されます。

したがって、clearTRUEに設定してDISABLEINDEXESANDCONTRAINTSプロシージャをコールする前に、この表または列で無効化された索引と制約がすべて再有効化されていることを確認する必要があります。

最初の実行では、clearTRUEに設定しておくことをお薦めします。それ以降の実行では(索引を無効化または有効化する際にエラーが発生したため)、clearFALSE(デフォルト値)に設定してください。バルク・ロード操作の後ですべての索引と制約を正常に再有効化できた場合は、clearTRUEに設定してプロシージャを再度コールし、次のバルク・ロード操作を行うことができます。

次の例では、DISABLEINDEXESANDCONSTRAINTSプロシージャとENABLEINDEXESANDCONSTRAINTSプロシージャでのclearの使用を示しています。

まず、PURCHASEORDER_TAB表のcomment要素に対して、非NULLの制約を追加します。

ALTER TABLE PURCHASEORDER_TAB ADD CONSTRAINT c1 check            ("XMLDATA"."comment" IS NOT NULL);

次に、DISABLEINDEXESANDCONSTRAINTSプロシージャをコールして、clearTRUEとして渡すことによって、すべての索引と制約を無効化します。

BEGIN
     XDB.DBMS_XMLSTORAGE_MANAGE.DISABLEINDEXESANDCONSTRAINTS
                                ( USER,'PURCHASEORDER_TAB',NULL,TRUE );
END;
/
 

さらに、ALTER表の文の制約c1に違反するバルク・ロード操作(データ・ポンプのインポートなど)を実行します。これで制約が無効化されるため、エラーは発生しません。

host impdp orexample/orexample directory=dir dumpfile=dmp.txt
   tables=OREXAMPLE.PURCHASEORDER_TAB content = DATA_ONLY;
 

ノート: 無効化された制約と索引を表示するには、次を使用します。

SELECT constraint_name,table_name,status FROM all_constraints  
  WHERE owner = user;

最後に、ENABLEINDEXESANDCONSTRAINTSプロシージャを使用して制約を有効化してみます。非NULL制約であるc1にバルク・ロード操作が違反したため、エラーが発生します。

BEGIN
     XDB.DBMS_XMLSTORAGE_MANAGE.ENABLEINDEXESANDCONSTRAINTS
                                         ( USER,'PURCHASEORDER_TAB');
END;
/

すべての索引と制約を無効化するには、再度DISABLEINDEXESANDCONSTRAINTSを使用します。ただし、clear=FALSEに設定します(ENABLEINDEXESANDCONSTRAINTSが正常に終了しなかったため)。ノート: デフォルトでは、clear = FALSEであるため、次にコールするときは、これを明示的に渡す必要はありません。

BEGIN
     xdb.DBMS_XMLSTORAGE_MANAGE.DISABLEINDEXESANDCONSTRAINTS
                                ( USER,'PURCHASEORDER_TAB');
END;
/
 

さらに、表に入力された不適切な行を削除します。

DELETE FROM purchaseorder_tab p
     WHERE p.xmldata."comment" IS NULL;
 

ENABLEINDEXESANDCONSTRAINTSを使用して、索引と制約を再有効化します。これは正常に終了します。

BEGIN
     xdb.DBMS_XMLSTORAGE_MANAGE.ENABLEINDEXESANDCONSTRAINTS
                                         ( USER,'PURCHASEORDER_TAB');
END;
/

226.3.2 ENABLEINDEXESANDCONSTRAINTSプロシージャ

このプロシージャはすべての索引を再構築し、XMLType表(子表および表外の表も含む)に対して制約を有効化します。

column_nameが渡された場合は、このXMLType列に対しても同じように作用します。

構文

DBMS_XMLSTORAGE_MANAGE.ENABLEINDEXESANDCONSTRAINTS (
   owner_name   IN VARCHAR2 DEFAULT USER, 
   table_name   IN VARCHAR2, 
   column_name  IN VARCHAR2 DEFAULT NULL);

パラメータ

表226-3 ENABLEINDEXESANDCONSTRAINTSプロシージャのパラメータ

パラメータ 説明

owner_user

所有者の名前。

table_name

索引と制約を削除中である表の名前

column_name

列名。

使用上のノート

このプロシージャは、DISABLEINDEXESANDCONSTRAINTSプロシージャとは逆の処理をします。

「DISABLEINDEXESANDCONSTRAINTSプロシージャ」を参照してください。

226.3.3 EXCHANGEPOSTPROCプロシージャ

このプロシージャは、パーティションの交換後に制約を有効化します。

構文

DBMS_XMLSTORAGE_MANAGE.EXCHANGEPOSTPROC (
   owner_name   IN VARCHAR2 DEFAULT USER, 
   table_name   IN VARCHAR2);

パラメータ

表226-4 EXCHANGEPOSTPROCプロシージャのパラメータ

パラメータ 説明

owner_user

所有者の名前。

table_name

索引と制約を削除中である表の名前

226.3.4 EXCHANGEPREPROCプロシージャ

このプロシージャは、パーティションの交換前に制約を無効化します。

構文

DBMS_XMLSTORAGE_MANAGE.EXCHANGEPREPROC (
   owner_name   IN VARCHAR2 DEFAULT USER, 
   table_name   IN VARCHAR2);

パラメータ

表226-5 EXCHANGEPREPROCプロシージャのパラメータ

パラメータ 説明

owner_user

所有者の名前。

table_name

索引と制約を削除中である表の名前

226.3.5 INDEXXMLREFERENCESプロシージャ

このプロシージャは、指定されたXMLタイプの表のREF列に、または指定された表のXMLタイプの列に、一意の索引を作成します。

このプロシージャで複数のREF列が作成された場合は、それぞれの名前に_1_2、などと追加されます。

構文

DBMS_XMLSTORAGE_MANAGE.INDEXXMLREFERENCES (
   owner_name    IN VARCHAR2 DEFAULT USER, 
   table_name    IN VARCHAR2,
   column_name   IN VARCHAR2 DEFAULT NULL);

パラメータ

表226-6 INDEXXMLREFERENCESプロシージャのパラメータ

パラメータ 説明

owner_name

所有者の名前。

table_name

索引付けが行われている表

column_name

列の名前。XMLタイプの表には不要です。

index_name

新規作成された索引の名前

使用上のノート

このプロシージャは、REFに有効範囲が指定されている場合にのみ使用します。「SCOPEXMLREFERENCESプロシージャ」を参照してください。

元表と子表の結合が問合せ計画で発生する場合、REFに索引を付けることによってパフォーマンスが向上します。

  • 元表の選択性が子表よりも高い場合、REFの索引付けは不要です。

  • 子表の選択性が元表よりも高く、索引が付けられていない場合は、子表の1つの行を元表に結合することによって、元表を全表スキャンすることができます。

INDEXXMLREFERENCESは、コール元の表の子表でREFを再帰的に索引付けすることはありません。そうするには、XML_OUT_OF_LINE_TABLESビューまたはXML_NESTED_TABLESビューのループ内でプロシージャをコールすることをお薦めします。これにより、ビュー内の列の現在値から索引名が作成されます。

ノート:

このプロシージャは構造化記憶域モデルに限定されています。

226.3.6 REFPARTITIONEXCHANGEINプロシージャ

これは、パーティション交換操作によりデータをパーティション化された表および(子表にローカルxmlindexを持つxmltype列がある場合は)子の参照パーティション表にロードする補助プロシージャです。

構文

DBMS_XMLSTORAGE_MANAGE.REFPARTITIONEXCHANGEIN (
   owner_name                 IN VARCHAR2,
   parent_table_name          IN VARCHAR2,
   child_table_name           IN VARCHAR2,
   parent_exchange_table_name IN VARCHAR2,
   child_exchange_table_name  IN VARCHAR2,
   parent_exchange_stmt       IN CLOB,
   child_exchange_stmt        IN CLOB);   

パラメータ

表226-7 REFPARTITIONEXCHANGEINのパラメータ

パラメータ 説明

owner_name

所有者の名前

parent_table_name

パーティション化された元表

child_table_name

parent_table_nameという名前の表に基づく参照パーティション化のためのパーティション化された表

parent_exchange_table_name

パーティション化された元表の交換対象の表

child_exchange_table_name

child_table_nameという名前の表の交換対象の表

parent_exchange_stmt

parent_table_nameという名前の表とparent_exchange_table_nameという名前の表の間でパーティション交換操作を実行するSQL文

child_exchange_stmt

child_table_nameという名前の表とchild_exchange_table_nameという名前の表の間でパーティション交換操作を実行するSQL文

226.3.7 REFPARTITIONEXCHANGEOUTプロシージャ

これは、パーティション交換操作によりデータをパーティション化された表および(子表にローカルxmlindexを持つxmltype列がある場合は)子の参照パーティション表からロードする補助プロシージャです。

構文

DBMS_XMLSTORAGE_MANAGE.REFPARTITIONEXCHANGEOUT (
   owner_name                 IN VARCHAR2,
   parent_table_name          IN VARCHAR2,
   child_table_name           IN VARCHAR2,
   parent_exchange_table_name IN VARCHAR2,
   child_exchange_table_name  IN VARCHAR2,
   parent_exchange_stmt       IN CLOB,
   child_exchange_stmt        IN CLOB);  

パラメータ

表226-8 REFPARTITIONEXCHANGEOUTのパラメータ

パラメータ 説明

owner_name

所有者の名前

parent_table_name

パーティション化された元表

child_table_name

parent_table_nameという名前の表に基づく参照パーティション化のためのパーティション化された表

parent_exchange_table_name

パーティション化された元表の交換対象の表

child_exchange_table_name

child_table_nameという名前の表の交換対象の表

parent_exchange_stmt

parent_table_nameという名前の表とparent_exchange_table_nameという名前の表の間でパーティション交換操作を実行するSQL文

child_exchange_stmt

child_table_nameという名前の表とchild_exchange_table_nameという名前の表の間でパーティション交換操作を実行するSQL文

226.3.8 RENAMECOLLECTIONTABLEプロシージャ

このプロシージャは、コレクション表の名前を指定された表名に変更します。

XPath式では、コレクション表の指定がXMLtype元表、またはこの元表のXMLType列から始まります。

このプロシージャは、コレクション表の名前を対応するコレクション・タイプの名前から導出する唯一の手段になります。この用途に応じた直接的なスキーマ注釈が存在しないからです。

構文

DBMS_XMLSTORAGE_MANAGE.RENAMECOLLECTIONTABLE (
   owner_name             IN VARCHAR2 DEFAULT USER,
   table_name             IN VARCHAR2,
   column_name            IN VARCHAR2 DEFAULT NULL,
   xpath                  IN VARCHAR2,
   collection_table_name  IN VARCHAR2
   namespaces             IN VARCHAR2 default NULL);  // For release 11.2 only

パラメータ

表226-9 RENAMECOLLECTIONTABLEプロシージャのパラメータ

パラメータ 説明

owner_name

所有者の名前

table_name

コレクション表を指定する際の開始点として使用できる元表の名前

column_name

コレクション表を指定する際の開始点として使用できるXMLType

xpath

コレクション表を指定するXPath式

collection_table_name

コレクション表の名前

namespaces

Oracle Database 11gリリース2(11.2)以降で使用可能。XPathで使用される名前空間です。

使用上のノート

このプロシージャは、XMLスキーマの登録後にコールしてください。

表名は索引名の接頭辞として使用されます。

問合せ実行計画が読みやすくなるため、このファンクションの使用をお薦めします。

このプロシージャの実行中に発生したエラーは、プロシージャをコールしたユーザーに報告してください。

ノート:

このプロシージャは構造化記憶域モデルに限定されています。

Oracle Database 11gリリース2(11.2)以降にかぎり、このファンクションではXPath表記法とDOT表記法が両方とも受け入れられます。XPath表記法を使用する場合は、namespacesパラメータが必要になる場合もあります。

コレクション表の名前はEMP_TAB_NAMELISTになります。これを検証するには、SELECT * FROM user_nested_tablesを使用します。

DOT表記法の使用:

call  XDB.DBMS_XMLSTORAGE_MANAGE.RENAMECOLLECTIONTABLE (
            USER,
            'EMP_TAB',
            NULL,
            '"XMLDATA"."EMPLOYEE"."NAME"',
           ''EMP_TAB_NAMELIST); 

XPath表記法の使用:

XPath表記法は、Oracle Database 11gリリース2(11.2)以降で使用可能です。

call  XDB.DBMS_XMLSTORAGE_MANAGE.RENAMECOLLECTIONTABLE (
               USER,
               'EMP_TAB',
               NULL,
               '/e:Employee/Name',
               'EMP_TAB_NAMELIST',
               '''http://www.oracle.com/emp.xsd'' as "e"'); 

226.3.9 SCOPEXMLREFERENCESプロシージャ

このプロシージャは、すべてのXML参照の有効範囲を指定します。有効範囲付きREFでは、有効範囲指定なしのREFに比べて、少ない記憶域でより効率的なアクセスが可能です。

構文

DBMS_XMLSTORAGE_MANAGE.SCOPEXMLREFERENCES;

使用上のノート

  • DBMS_XMLSTORAGE_MANAGE パッケージのSETOUTOFLINEプロシージャを使用した場合、XMLスキーマの登録時に'4096 column limit'エラーの発生を回避するために、SCOPEXMLREFERENCESプロシージャも使用する必要があります。

  • XMLスキーマの登録後のXMLインスタンス・データのロード前にSCOPEXMLREFERENCESを使用すると、これらの参照の有効範囲が表外の表にのみ指定されます。

ノート:

このプロシージャは構造化記憶域モデルに限定されています。

226.3.10 XPATH2TABCOLMAPPINGファンクション

このファンクションは、パス式を(XPath表記法またはDOT表記法で)対応する表名と列名にマップします。これは、ユーザーがこの表に索引を作成する場合や制約を追加する場合、または問合せ実行計画を読みやすくするために表の名前を変更する場合に必要になります。

構文

DBMS_XMLSTORAGE_MANAGE.XPATH2TABCOLMAPPING (
   owner_name   IN  VARCHAR2 DEFAULT USER, 
   table_name   IN  VARCHAR2,
   column_name  IN  VARCHAR2 DEFAULT NULL,
   xpath        IN  VARCHAR2,
   namespaces   IN  VARCHAR2 DEFAULT NULL)
 RETURN XMLTYPE;

パラメータ

表226-10 XPATH2TABCOLMAPPINGプロシージャのパラメータ

パラメータ 説明

owner_user

所有者の名前。

table_name

元表の名前

column_name

table_nameがXMLtype表でない場合のXMLtype列のオプション名。table_nameがXMLType表を参照する場合は、column_nameをNULLにしてください。

xpath

DOT表記法またはXPath表記法でのパス式(次の例を参照)

namespaces

パス式のオプション名前空間の定義

Xpath表記法と名前空間を指定してXMLType表で評価されたXPath2TablColMapping

SELECT XDB.DBMS_XMLSTORAGE_MANAGE.XPATH2TABCOLMAPPING (
   USER, 'XML_TAB', '', '//n1:item/n1:location','''xdbXmark'' as "n1"') 
FROM DUAL;

これは、次のような結果を生成します。

<Result>
<Mapping TableName="SYS_NT12345" ColumnName="location"/>
</Result>

これにより、表SYS_NT12345および列locationに対して索引または制約を定義することができます。

XMLTypeではないが、DOT表記法によるXMLType列を持つ表で評価されたXPath2TablColMapping

SELECT XDB.DBMS_XMLSTORAGE_MANAGE.XPATH2TABCOLMAPPING (   
   USER,'PurchaseOrderTab','XMLCOL','xmldata.LineItems.LineItem', '')
FROM DUAL;