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

前
次

18 XML Schemaの格納と問合せ: オブジェクト・リレーショナル記憶域

XML Schemaに基づくデータに対する高度なテクニックには、オブジェクト・リレーショナル記憶域の使用、XML Schemaの注釈付け、XML Schemaデータ型のSQLへのマッピング、complexTypeの拡張および制限の使用、XML Schemaに基づくデータの作成、XML Schemaに基づくデータに対するリレーショナル制約の指定およびXML Schemaに基づくデータのパーティション化、XMLTypeデータの表外格納、複雑または大規模なスキーマの操作、スキーマ登録のデバッグなどがあります。

関連項目:

18.1 XML文書のオブジェクト・リレーショナル記憶域

XML文書のオブジェクト・リレーショナル記憶域には、文書のコンテンツが一連のSQLオブジェクトに分解されて格納されます。これらのSQLオブジェクトは、SQL 1999タイプのフレームワークに基づいています。XML SchemaがOracle XML DBに登録されると、必要なSQL型定義がXML Schemaから自動的に生成されます。

SQL型定義は、XML Schemaで定義された各complexTypeから生成されます。complexTypeで定義された各要素または属性は、対応するSQL型のSQL属性になります。Oracle XML DBは、XML Schema勧告で定義された47のスカラー・データ型を、SQLでサポートされている19のスカラー・データ型に自動的にマップします。VARRAY型は要素ごとに生成され、複数回、生成される場合があります。

生成されたSQL型により、XML Schemaに準拠するXMLコンテンツは、分解され、情報を損失せずに一連のオブジェクトとしてデータベースに格納できます。XML文書が収集されると、XML Schemaにより定義された構造体は同等のSQL型に直接マップされます。これにより、Oracle XML DBでは、XMLを管理するときにOracle Databaseのすべての機能を使用でき、文書の格納に必要な容量を大幅に削減できます。また、XMLコンテンツの問合せおよび更新に必要なメモリーの量も削減できます。

18.1.1 オブジェクト・リレーショナル形式のXMLType記憶域の場合のコレクション格納方法

Ordered Collectionは、ヒープに基づく表(推奨)と索引構成表(IOT)のいずれかにすることができるOrdered Collection Table (OCT)のVARRAYとして格納できます。データに対するREFであるVARRAYエントリを使用して、実際のデータを表外に格納できます。

オブジェクト・リレーショナル形式で格納されるXMLTypeデータのXML Schemaを登録し、登録パラメータGENTABLESTRUEに設定する場合、関連付けられたXMLインスタンス・ドキュメントを格納するためにデフォルト表が自動的に作成されます。

格納されるときに、XMLコレクション要素の順序は維持されます。結果はOrdered Collectionです。脚注 1データは次の方法でOrdered Collectionに格納できます。

  • 表内のVARRAY。コレクション内の各要素は、SQLオブジェクトにマップされます。SQLオブジェクトのコレクションは、Ordered Collection Table (OCT)と呼ばれる表に、一連の行として格納されます。デフォルトでは、すべてのコレクションがOCTに格納されます。

    このデフォルト動作は、XML Schema注釈xdb:storeVarrayAsTable = "true"(デフォルト値)に対応しています。脚注 2

  • LOB内のVARRAY (非推奨)。コレクション内の各要素は、SQLオブジェクトにマップされます。SQLオブジェクトのコレクション全体が、VARRAYとしてシリアライズされてLOB列に格納されます。指定されたコレクションをLOB内のVARRAYとして格納するには、XML Schema注釈xdb:storeVarrayAsTable = "false"を使用します。脚注 2

Ordered Collectionでは表外への格納を使用することもできます。これはXML Schema注釈SQLInline = "false"に対応しており、コレクション表(またはLOB)内のREFのVARRAYが、表外に格納されたコレクションの内容に追随していることを意味します。

使用する前に、XML Schemaに注釈を付ける必要はありません。XML Schemaに注釈が付いていない場合、Oracle XML DBは一連のデフォルトの前提を使用してXML Schemaを処理します。

この項で取り上げた注釈のいずれも付けなかった場合、Oracle XML DBはコレクションをヒープに基づくOCTとして格納します。OCTを強制的に索引構成表(IOT)として格納するには、DBMS_XMLSCHEMA.registerSchemaOPTIONSパラメータでREGISTER_NT_AS_IOTを渡します。

注意:

Oracle Database 11gリリース1より前のリリースの場合:

  • OCTはデフォルトでIOTとして格納されていました。

  • xdb:storeVarrayAsTableのデフォルト値はfalseでした。

注意:

OracleからIOTの使用を明示的に指示された場合を除き、IOTでなく、ヒープに基づくOCTを使用してください。IOTの記憶域には、次のような大きな制限があります。

  • コレクション表(IOT)のパーティショニングが無効化されます。

  • 文書レベルのOracle Text索引しかサポートされません。要素に固有の索引や属性に固有の索引は無効になります。

関連項目: XMLデータでOracle Textを使用する方法の詳細は、「XQueryを使用しないXMLデータの全文検索」を参照してください。

関連項目:

18.1.2 オブジェクト・リレーショナル記憶域に対してXML Schema登録時に作成されるSQL型

オブジェクト・リレーショナル形式で格納されているXMLデータで使用するためにXML Schemaを登録する際は、パラメータGENTYPESの値にTRUEを使用します(TRUEがデフォルト値)。これにより、Oracle XML DBでは、準拠するXML文書のオブジェクト・リレーショナル記憶域に対応した適切なSQLオブジェクト型が作成されます。

デフォルトでは、SQLオブジェクト型はXML Schema登録者のデータベース・スキーマに作成されます。注釈xdb:defaultSchemaが使用されている場合は、Oracle XML DBによって、指定されたデータベース・スキーマを使用してオブジェクト型の作成が試行されます。現行のユーザーがこのオブジェクト型を作成するには、必要な権限を取得している必要があります。

例18-1に、XML Schema purchaseOrder.xsdがOracle XML DBで登録された場合に自動的に作成されるSQLデータ型を示します。

注意:

デフォルトでは、SQLオブジェクト型および属性の名前はシステム生成されます。例18-1がその例です。XML SchemaにSQLName属性が含まれていない場合、SQL名はXMLの名前から導出されます。XML Schema注釈を使用すると、ユーザー定義の名前を使用できます(詳細は、「OracleでのXML Schemaの注釈」を参照してください)。

例18-1 XMLType表を格納するためのSQLオブジェクト型

DESCRIBE "PurchaseOrderType1668_T"
  
"PurchaseOrderType1668_T" is NOT FINAL
Name                 Null?  Type
-------------------- ------ -------------------------------
SYS_XDBPD$                  XDB.XDB$RAW_LIST_T
Reference                   VARCHAR2(30 CHAR)
Actions                     ActionsType1661_T
Reject                      RejectionType1660_T
Requestor                   VARCHAR2(128 CHAR)
User                        VARCHAR2(10 CHAR)
CostCenter                  VARCHAR2(4 CHAR)
ShippingInstructions        ShippingInstructionsTyp1659_T
SpecialInstructions         VARCHAR2(2048 CHAR)
LineItems                   LineItemsType1666_T
Notes                       VARCHAR2(4000 CHAR)
 
DESCRIBE "LineItemsType1666_T"
 
"LineItemsType1666_T" is NOT FINAL
Name                 Null? Type
-------------------- ----- -------------------------------
SYS_XDBPD$                 XDB.XDB$RAW_LIST_T
LineItem                   LineItem1667_COLL
 
DESCRIBE "LineItem1667_COLL"

"LineItem1667_COLL" VARRAY(2147483647) OF LineItemType1665_T
"LineItemType1665_T" is NOT FINAL
Name                Null? Type
------------------- ----- --------------------------------
SYS_XDBPD$                XDB.XDB$RAW_LIST_T
ItemNumber                NUMBER(38)
Description               VARCHAR2(256 CHAR)
Part                      PartType1664_T

18.1.3 XML Schemaの登録時に作成されるデフォルト表

デフォルト表は、XML Schema登録の一部として作成できます。デフォルト表は、FTPやHTTP(S)など、表が指定されないAPIおよびプロトコルを介して文書が挿入される場合に非常に役立ちます。

この場合、XMLインスタンスはデフォルト表に挿入されます。

例18-2に、デフォルトのpurchase-order table表を示します。

属性xdb:defaultTableに値を指定すると、その名前でXMLType表が作成されます。それ以外の場合は、内部生成された名前で作成されます。

xdb:tablePropsおよびxdb:columnProps属性を使用して指定されたすべてのテキストが、生成されたCREATE TABLE文に追加されます。

例18-2 グローバル要素PurchaseOrderのデフォルト表

DESCRIBE "PurchaseOrder1669_TAB"

Name                        Null? Type
--------------------------- ----- -----------------------
TABLE of
  SYS.XMLTYPE(
    XMLSchema "http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd"
    Element "PurchaseOrder")
  STORAGE OBJECT-RELATIONAL TYPE "PurchaseOrderType1668_T"

18.1.4 XML Schemaの登録時に生成された内部構造体を使用しない

一般的に、XML Schemaの登録中に自動的に生成されたSQL構造体(データ型、ネストされた表、および表外の記憶域に関連付けられている表)は、Oracle XML DB内部にあります。これらをコードで使用しないことをお薦めします。

より正確には、生成されたSQLデータ型、ネストされた表、および表外の記憶域に関連付けられている表は、Oracleによっていつでも変更および再定義される、特定の内部のXML Schemaとオブジェクト型のマッピングに基づいています。一般的に次が成立します。

  • 生成されたSQLデータ型は使用しないでください。

  • 生成されたネストされた表または表外へのアクセスまたは変更は行わないでください。

ただし、生成された表のパーティション化などの記憶域オプションは変更できます。また、生成された表に対して索引または制約を作成することはできます。また、生成された構造体に名前を付ける注釈など、Oracle XML DBに付属するXML Schema注釈は自由に使用できます。

18.1.5 大/小文字が区別される生成名

XML Schemaの登録で生成されたSQL表、オブジェクト、属性の名前は、大/小文字が区別されます

たとえば例18-2で、表PurchaseOrder1669_TABの名前は要素PurchaseOrderの名前から導出されているため、これも大/小文字が混在しています。このため、この表を参照する際に識別子に引用符を使用("PurchaseOrder1669_TAB")する必要があります。使用しないと、ORA-00942: 表またはビューが存在しませんなどの、オブジェクトが見つからないというエラーが発生します。

18.1.6 SYS_XDBPD$とオブジェクト・リレーショナル記憶域のDOM再現性

オブジェクト・リレーショナル形式で格納されているXMLデータのDOM再現性を示すために、Oracle XML DBは、システム定義のバイナリ・オブジェクト属性SYS_XDBPD$ (位置指定ディスクリプタ(PD))を使用して、他のオブジェクト属性に格納できないすべての情報をインスタンス・レベルのメタデータとして記録します。

XMLデータのオブジェクト・リレーショナル記憶域では、XML Schemaで宣言された要素および属性は、対応するSQLオブジェクト型の個別の属性にマップされます。ただし、XMLインスタンス・ドキュメント内の次の情報は、これらのオブジェクト属性に格納されません。

  • 名前空間宣言

  • コメント

  • 接頭辞情報

オブジェクト・リレーショナル形式で格納されているXMLデータのDOM再現性を示すために、Oracle XML DBは別の機構を使用してこの情報を追跡し、これをインスタンス・レベルのメタデータとして記録します。

このメタデータは、システム定義のバイナリ・オブジェクト属性SYS_XDBPD$を使用して型レベルで追跡されます。このオブジェクト属性を位置指定ディスクリプタまたは短縮してPDと呼びます。

PDは、Oracle XML DBの内部でのみ使用する属性です。列PDに直接アクセスしたり、操作しないでください。

他のオブジェクト属性に格納できない情報はすべて、この位置指定ディスクリプタによって格納されます。Oracle XML DBに格納されたすべてのXML文書のDOM再現性を保証するために、PD情報が使用されます。PD情報には、たとえば注文情報、コメント、処理命令、名前空間の接頭辞などがあります。

DOM再現性が不要な場合は、型レベルでXML Schema定義のxdb:maintainDOM属性をfalseに設定し、SYS_XDBPD$の使用を省略できます。

注意:

このマニュアルの多くの例では、簡略化のためSYS_XDBPD$オブジェクト属性を省略しています。ただし、この属性は、XML Schemaの登録処理によって生成されたすべてのSQLオブジェクト型に、位置指定ディスクリプタ(PD)列として常に存在します。

通常は、PD属性を省略しないことをお薦めします。PD列が存在しない場合、コメント、処理命令などの情報が失われる可能性があるためです。

18.2 OracleでのXML Schemaの注釈

XML Schemaに注釈を付けることによって、XML Schema登録処理によって生成されるオブジェクトおよび表に影響を与えることができます。これを行うには、Oracle特有の属性を、XML Schemaによって宣言されるcomplexTypeelementおよびattributeの定義に追加します。

このような注釈を手動で追加するには、XML Schema文書を編集するか、または注釈固有のPL/SQLサブプログラム(ほとんどの一般的な注釈に対応)を呼び出します。『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_XMLSCHEMA_ANNOTATE」を参照してください。

Altova XMLSpyエディタを使用してXML Schemaを手動で編集する場合は、このエディタの「Oracle」タブを利用して、Oracle固有の注釈を追加および編集できます。図17-2を参照してください。

Oracle XML DBによって使用される大部分のXML属性は、名前空間http://xmlns.oracle.com/xdbに属します。XMLデータをバイナリXML形式でエンコードするために使用されるXML属性は、名前空間http://xmlns.oracle.com/2004/CSXに属します。XML Schemaの注釈の処理を単純化するために、名前空間接頭辞はXML Schemaのルート要素で宣言することをお薦めします。

18.2.1 XMLスキーマ注釈の一般的な使用

XML Schemaに注釈を付けてオブジェクト・リレーショナル表、オブジェクトおよびオブジェクト属性に名前を付けたり、XPath式の引数が再帰的なXMLデータをターゲットとしているときのXPathリライトを許可することができます。

XML Schemaに注釈を付ける一般的な理由は、次のとおりです。

  • XMLTypeデータのオブジェクト・リレーショナル記憶域に対してPL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaで作成された表やオブジェクト、オブジェクト属性の名前が、わかりやすくすべてのアプリケーション・ネーミング標準に準拠することを保証するため。この場合は、パラメータGENTYPESまたはGENTABLESTRUEに設定します(TRUEはこれらの各パラメータのデフォルト値)。

  • SQLで直接作業する場合、引用符で囲まれた識別子を使用する必要のある、大/小文字の混在する名前が生成されないようにします。

  • 文書が相互に関連する再帰的なXPath問合せの場合に、オブジェクト・リレーショナル記憶域のXPathリライトを可能にするため。これは、再帰的なXMLデータをターゲットとしているXPath式の引数を使用する、SQL/XMLアクセスおよび問合せ関数の特定の用途に適用されます。

最も一般的に使用されるXML Schema注釈は、次のとおりです。

  • xdb:defaultTable: GENTABLESパラメータがTRUEの場合に、各グローバル要素に生成されるデフォルトの表の名前。この注釈を空の文字列""に設定すると、該当する要素にデフォルトの表が生成されなくなります。

  • xdb:SQLName: XML Schemaに定義されている各要素または属性に対応するSQLオブジェクト属性の名前。

  • xdb:SQLType: complexType定義の場合、対応するオブジェクト・タイプ。simpleType定義では、XML Schemaデータ型とSQLデータ型間のデフォルト・マッピングをオーバーライドするためにSQLTypeを使用します。SQLTypeは、無制限の文字列をVARCHAR(4000) CHAR値(デフォルト)ではなく、CLOB値として格納する必要がある場合に定義するのが、一般的な使用方法です。注意: データ型NCHARNVARCHAR2またはNCLOBは、SQLType注釈の値としては使用できません。

  • xdb:SQLCollType - 要素のコレクションを管理するVARRAY型を指定するために使用します。

  • xdb:maintainDOM - 指定されているcomplexType定義のDOM再現性を維持する必要があるかどうかを判断するために使用します。

これらの属性のいずれにも、値を指定する必要はありません。Oracle XML DBにより、デフォルトで、XML Schemaの登録プロセス中に適切な値が提供されます。ただし、オブジェクト・リレーショナル記憶域を使用する場合、少なくとも最上位のSQL型の名前を指定し、後で参照できるようにすることをお薦めします。

18.2.2 XML Schema注釈の例

XML Schemaの例に、最も重要なOracle XML DB注釈の一部を示します。

例18-3のXML Schemaは、例A-2のXML Schemaと似ていますが、ここではNotes要素とその型NotesTypeも定義しています。

  • schema要素にはxdb名前空間の宣言が含まれます。

  • グローバル要素PurchaseOrderの定義には、この要素に関連付けられているデフォルトの表名をpurchaseorderに指定するdefaultTable注釈が含まれています。

  • グローバルな複合型PurchaseOrderTypeの定義には、生成されるSQLオブジェクトの型名をpurchaseorder_tに指定するSQLType注釈が含まれています。この種の定義には、次の注釈が使用されます。

    • 要素Referenceの定義には、XML要素Referenceに対応するSQL属性をreferenceという名前にするSQLName注釈が指定されています。

    • 要素Actionsの定義には、XML要素Actionsに対応するSQL属性の名前をaction_collectionにするSQLName注釈が指定されています。

    • 要素USERの定義には、XML要素Userに対応するSQL属性の名前をemailにするSQLName注釈が指定されています。

    • 要素LineItemsの定義は、XML要素LineItemsに対応するSQL属性の名前をlineitem_collectionにするSQLName注釈が指定されています。

    • 要素Notesの定義には、XML要素Notesに対応するSQL属性のデータ型をCLOBにするSQLType注釈が指定されています。

  • グローバルな複合型LineItemTypeの定義には、生成されるSQLオブジェクトの型名をlineitem_tに指定するSQLType注釈が含まれています。この種の定義には、次の注釈が使用されます。

    • LineItem要素の定義には、XML要素LineItemsに対応するSQL属性のデータ型の名前をlineitem_varrayにするSQLName注釈と、コレクションを管理するSQLオブジェクトの型名をlineitem_vにするSQLCollName注釈が指定されています。

  • グローバルな複合型LineItemsTypeの定義には、生成されるSQLオブジェクトの型名をlineitems_tに指定するSQLType注釈が含まれています。

  • 複合型PartTypeの定義には、SQLオブジェクトの型名をpart_tに指定するSQLType注釈が含まれています。注釈xdb:maintainDOM = "false"も含まれ、Oracle XML DBでこのデータ型に基づく要素のDOM再現性を保持する必要がないことを指定します。

例18-4は、例18-3の注釈付きXML Schemaの登録で作成された表およびオブジェクトの一部を示しています。

次に、XML Schema登録の結果を示します。

  • purchaseorderという表が作成されました。

  • purchaseorder_tlineitems_tlineitem_vlineitem_tおよびpart_tという型が作成されました。これらの型で定義された属性は、SQLName注釈の指定に従って名前が付けられます。

  • purchaseorder_tによって定義されたNotes属性のデータ型は、CLOBになります。

  • part_tに、位置指定ディスクリプタ(PD)属性は含まれていません。

  • LineItemおよびAction要素のコレクションを管理するために、Ordered Collection Table(OCT)が作成されました。

例18-3 一般的なスキーマ注釈の使用

<xs:schema
  targetNamespace="http://xmlns.oracle.com/xdb/documentation/purchaseOrder"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:xdb="http://xmlns.oracle.com/xdb"
  xmlns:po="http://xmlns.oracle.com/xdb/documentation/purchaseOrder"
  version="1.0">
  <xs:element name="PurchaseOrder" type="po:PurchaseOrderType"
              xdb:defaultTable="PURCHASEORDER"/>
  <xs:complexType name="PurchaseOrderType" xdb:SQLType="PURCHASEORDER_T">
    <xs:sequence>
      <xs:element name="Reference" type="po:ReferenceType" minOccurs="1"
                  xdb:SQLName="REFERENCE"/>
      <xs:element name="Actions" type="po:ActionsType"
                  xdb:SQLName="ACTION_COLLECTION"/>
      <xs:element name="Reject" type="po:RejectionType" minOccurs="0"/>
      <xs:element name="Requestor" type="po:RequestorType"/>
      <xs:element name="User" type="po:UserType" minOccurs="1"
                  xdb:SQLName="EMAIL"/>
      <xs:element name="CostCenter" type="po:CostCenterType"/>
      <xs:element name="ShippingInstructions"
                  type="po:ShippingInstructionsType"/>
      <xs:element name="SpecialInstructions" type="po:SpecialInstructionsType"/>
      <xs:element name="LineItems" type="po:LineItemsType"
                  xdb:SQLName="LINEITEM_COLLECTION"/>
      <xs:element name="Notes" type="po:NotesType" xdb:SQLType="CLOB"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="LineItemsType" xdb:SQLType="LINEITEMS_T">
    <xs:sequence>
      <xs:element name="LineItem" type="po:LineItemType" maxOccurs="unbounded"
                  xdb:SQLCollType="LINEITEM_V" xdb:SQLName="LINEITEM_VARRAY"/>
   </xs:sequence>
  </xs:complexType>
  <xs:complexType name="LineItemType" xdb:SQLType="LINEITEM_T">
    <xs:sequence>
      <xs:element name="Description" type="po:DescriptionType"/>
      <xs:element name="Part" type="po:PartType"/>
    </xs:sequence>
    <xs:attribute name="ItemNumber" type="xs:integer"/>
  </xs:complexType>
  <xs:complexType name="PartType" xdb:SQLType="PART_T" xdb:maintainDOM="false">
    <xs:attribute name="Id">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:minLength value="10"/>
          <xs:maxLength value="14"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="Quantity" type="po:moneyType"/>
    <xs:attribute name="UnitPrice" type="po:quantityType"/>
  </xs:complexType>
  <xs:simpleType name="NotesType">
    <xs:restriction base="xs:string">
      <xs:minLength value="1"/>
      <xs:maxLength value="32767"/>
    </xs:restriction>
  </xs:simpleType>
</xs:schema>

例18-4 注釈付きXML Schemaの登録

BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd',
    SCHEMADOC => bfilename('XMLDIR', 'purchaseOrder.Annotated.xsd'),
    LOCAL     => TRUE,
    GENTYPES  => TRUE,
    GENTABLES => TRUE,
    CSID      => nls_charset_id('AL32UTF8'));
END;
/
 
SELECT table_name, xmlschema, element_name FROM USER_XML_TABLES;
 
TABLE_NAME     XMLSCHEMA                             ELEMENT_NAME
-------------  -----------------------------------   -------------
PURCHASEORDER  http://xmlns.oracle.com/xdb/documen   PurchaseOrder
               tation/purchaseOrder.xsd              
 
1 row selected.
 
DESCRIBE purchaseorder

Name                            Null? Type
------------------------------  ----- -----------------
TABLE of SYS.XMLTYPE(XMLSchema
 "http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd"
 ELEMENT "PurchaseOrder") STORAGE Object-relational TYPE "PURCHASEORDER_T"
 
DESCRIBE purchaseorder_t

PURCHASEORDER_T is NOT FINAL
Name                 Null? Type
-------------------- ----- --------------------------
SYS_XDBPD$                 XDB.XDB$RAW_LIST_T
REFERENCE                  VARCHAR2(30 CHAR)
ACTION_COLLECTION          ACTIONS_T
REJECT                     REJECTION_T
REQUESTOR                  VARCHAR2(128 CHAR)
EMAIL                      VARCHAR2(10 CHAR)
COSTCENTER                 VARCHAR2(4 CHAR)
SHIPPINGINSTRUCTIONS       SHIPPING_INSTRUCTIONS_T
SPECIALINSTRUCTIONS        VARCHAR2(2048 CHAR)
LINEITEM_COLLECTION        LINEITEMS_T
Notes                      CLOB

DESCRIBE lineitems_t
LINEITEMS_T is NOT FINAL
Name                 Null? Type
-------------------- ----- --------------------------
SYS_XDBPD$                 XDB.XDB$RAW_LIST_T
LINEITEM_VARRAY            LINEITEM_V

DESCRIBE lineitem_v

LINEITEM_V VARRAY(2147483647) OF LINEITEM_T
LINEITEM_T is NOT FINAL
Name                 Null? Type
-------------------- ----- --------------------------
SYS_XDBPD$                 XDB.XDB$RAW_LIST_T
ITEMNUMBER                 NUMBER(38)
DESCRIPTION                VARCHAR2(256 CHAR)
PART                       PART_T

DESCRIBE part_t
 
PART_T is NOT FINAL
Name                 Null? Type
-------------------- ----- --------------------------
ID                         VARCHAR2(14 CHAR)
QUANTITY                   NUMBER(12,2)
UNITPRICE                  NUMBER(8,4)

SELECT table_name, parent_table_column FROM USER_NESTED_TABLES
  WHERE parent_table_name = 'purchaseorder';

TABLE_NAME                       PARENT_TABLE_COLUMN
----------                       -----------------------   
SYS_NTNOHV+tfSTRaDTA9FETvBJw==   "XMLDATA"."LINEITEM_COLLECTION"."LINEITEM_VARRAY"
SYS_NTV4bNVqQ1S4WdCIvBK5qjZA==   "XMLDATA"."ACTION_COLLECTION"."ACTION_VARRAY"
 
2 rows selected.

18.2.3 DBMS_XMLSCHEMA_ANNOTATEを使用したXML Schemaの注釈付け

PL/SQLパッケージDBMS_XMLSCHEMA_ANNOTATEはXML Schemaに注釈を付けるサブプログラムを備えています。これらのサブプログラムは通常、XML Schemaを手動で編集するよりも便利でエラーが発生しにくくなります。

特に、スクリプトでPL/SQLサブプログラムを使用すれば、必要に応じていつでも繰り返し実行できます。これは、大規模なXML Schema、標準またはサード・パーティのXML Schemaを使用しているため手動で編集したくない場合には特に有効です。

Oracle注釈ごとに固有のPL/SQLサブプログラムが用意されています。たとえば、xdb:defaultTable注釈の追加にはPL/SQLプロシージャsetDefaultTableを、xdb:defaultTable注釈の削除にはremoveDefaultTableをそれぞれ使用します。

注釈サブプログラムごとに次のものをパラメータとして保持しています。

  • 注釈対象のXML Schema。このパラメータはIN OUTです。

  • 注釈を追加または削除する対象のグローバル要素の名前。

  • 注釈(XML属性)の値。

  • 対応する既存の注釈を上書きするかどうかを示すブール・フラグ。デフォルトでは、上書きされます。

注釈対象の要素がグローバル要素以外の場合は、ローカル要素名を追加パラメータとして提供します。グローバル名とローカル名を組み合せてターゲット要素を特定します。ローカル名を持つ要素は、グローバル名を持つ要素の下位に位置する必要があります。

SQL*Plusを使用する場合、PL/SQLプロシージャDBMS_XMLSCHEMA_ANNOTATE.printWarningsを使用すれば、その他のDBMS_XMLSCHEMA_ANNOTATEサブプログラムを使用する際に、SQL*Plusの警告の出力を有効または無効にできます。デフォルトでは、警告は出力されません。たとえば、注釈サブプログラムに対して指定した名前の要素が存在しないため、XML Schemaに注釈を付けられないなどの警告があります。

例18-5では、PL/SQLパッケージDBMS_XMLSCHEMA_ANNOTATE内のサブプログラムを使用して、例18-3で示した注釈付きXML Schemaを生成します。

関連項目:

『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_XMLSCHEMA_ANNOTATE」

例18-5 DBMS_XMLSCHEMA_ANNOTATEの使用

CREATE TABLE annotation_tab (id NUMBER, inp XMLType, out XMLType);
INSERT INTO annotation_tab VALUES (1, ... unannotated XML schema...);

DECLARE
  schema XMLType;
BEGIN
  SELECT t.inp INTO schema FROM annotation_tab t WHERE t.id = 1;

  DBMS_XMLSCHEMA_ANNOTATE.setDefaultTable(schema, 'PurchaseOrder', 'PURCHASEORDER');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLType(schema, 'PurchaseOrderType', 'PURCHASEORDER_T');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLName(schema, 'complexType', 'PurchaseOrderType', 'element', 'Reference',
                                     'REFERENCE');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLName(schema, 'complexType', 'PurchaseOrderType', 'element', 'Actions',
                                     'ACTIONS_COLLECTION');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLName(schema, 'complexType', 'PurchaseOrderType', 'element', 'User', 'EMAIL');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLName(schema, 'complexType', 'PurchaseOrderType', 'element', 'LineItems',
                                     'LINEITEM_COLLECTION');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLType(schema, 'complexType', 'PurchaseOrderType', 'element', 'Notes', 'CLOB');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLType(schema, 'LineItemsType', 'LINEITEMS_T');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLCollType(schema, 'complexType', 'LineItemsType', 'LineItem', 'LINEITEM_V');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLName(schema, 'complexType', 'LineItemsType', 'element', 'LineItem',
                                     'LINEITEM_VARRAY');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLType(schema, 'LineItemType', 'LINEITEM_T');
  DBMS_XMLSCHEMA_ANNOTATE.setSQLType(schema, 'PartType', 'PART_T');
  DBMS_XMLSCHEMA_ANNOTATE.disableMaintainDom(schema, 'PartType');

UPDATE annotation_tab t SET t.out = schema WHERE t.id = 1;
END;
/

18.2.4 使用できるOracle XML DBのXML Schema注釈

要素と属性の宣言に指定できるOracle XML DB注釈を、その操作に使用可能な、パッケージDBMS_XMLSCHEMA_ANNOTATEのPL/SQLサブプログラムとともに説明します。

接頭辞csxがあるもの以外のすべての注釈は、オブジェクト・リレーショナル記憶域に対して登録されたXML Schemaに適用できます。

次の注釈は、バイナリXML記憶域に対して登録されたXML Schemaに適用されます。

  • xdb:defaultTable

  • xdb:defaultTableSchema (非推奨)

  • xdb:tableProps

関連項目:

『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_XMLSCHEMA_ANNOTATE」

表18-1 要素内の注釈

属性およびPL/SQL デフォルト 説明
xdb:columnProps

適用可能なPL/SQLなし。

任意の列STORAGE句

NULL

デフォルトのCREATE TABLE文に挿入される列STORAGE句を指定します。主に、SQL表にマップされる要素(最上位の要素の宣言および表外の要素の宣言)に有効です。

xdb:defaultTable

PL/SQL:

setDefaultTable
removeDefaultTable
enableDefaultTableCreation
disableDefaultTableCreation

表の名前

要素名に基づきます。

このXML SchemaのXMLインスタンスを格納する必要があるSQL表の名前を指定します。これは、表の名前が指定されていないAPIおよびプロトコル(FTP、HTTP(S)など)を使用してXMLを挿入する場合に最も有効です。オブジェクト・リレーショナル記憶域およびバイナリXML記憶域に適用されます。

xdb:defaultTableSchemaFoot 3

非推奨。適用可能なPL/SQLなし。

任意のSQLユーザー名

XML Schemaを登録するユーザー

xdb:defaultTableによって指定された型を所有するデータベース・ユーザー(データベース・スキーマ)の名前を指定します。オブジェクト・リレーショナル記憶域およびバイナリXML記憶域に適用されます。

xdb:maintainDOM

PL/SQL:

enableMaintainDOM
disableMaintainDOM

true | false

true

trueの場合、この要素のインスタンスは出力でDOM再現性が保持されるように格納されます。これは、要素の順序の他に、すべてのコメント、処理命令、ネームスペース宣言などが保持されることを意味します。

falseの場合は、出力で入力と同じDOM操作が保持されない場合があります。

xdb:maintainOrderFootref 3

非推奨。適用可能なPL/SQLなし。

true | false

true

trueの場合(一般的に推奨、デフォルト値)、コレクションはVARRAYにマップされます(LOBまたはOrdered Collection Tableに格納されます)。

falseの場合、コレクションは順序付けられていない表にマップされ、ドキュメント内の順序は保持されません

xdb:SQLCollSchemaFootref 3

非推奨。適用可能なPL/SQLなし。

任意のSQLユーザー名

XML Schemaを登録するユーザー

xdb:SQLCollTypeによって指定された型を所有するデータベース・ユーザー(データベース・スキーマ)の名前を指定します。

xdb:SQLCollType

PL/SQL:

setSQLCollType
removeSQLCollType

任意のSQLコレクション型

要素名から生成された名前

このXML要素に対応するSQLコレクション型の名前。XML要素は、maxOccurs > 1と指定されている必要があります。

xdb:SQLInline

PL/SQL:

setOutOfLine
removeOutOfLine

true | false

true

trueの場合、この要素は埋込みオブジェクト属性(maxOccurs > 1の場合はコレクション)として表内に格納されます。

falseの場合は、REF値(maxOccurs>1の場合はREF値のコレクション)が格納されます。SQLでインラインがサポートされない特定の状況(循環参照など)では、この属性は強制的にfalseになります。

xdb:SQLName

PL/SQL:

setSQLName
removeSQLName

SQL識別子

要素名

このXML要素にマップされるSQLオブジェクト内での属性の名前。

xdb:SQLSchemaFootref 3

非推奨。適用可能なPL/SQLなし。

任意のSQLユーザー名

XML Schemaを登録するユーザー

SQLTypeによって指定された型を所有するデータベース・ユーザー(データベース・スキーマ)の名前を指定します。

xdb:SQLType

PL/SQL:

setSQLType
removeSQLType

任意のSQLデータ型脚注 4,(NCHARNVARCHAR2およびNCLOB除く)

要素名から生成された名前

このXML要素の宣言に対応するSQL型の名前。

xdb:tableProps

PL/SQL:

setTableProps
removeTableProps

任意の表STORAGE句

NULL

デフォルトのCREATE TABLE文に追加されるTABLE STORAGE句を指定します。主に、グローバルな要素および表外の要素に有効です。オブジェクト・リレーショナル記憶域およびバイナリXML記憶域に適用されます。

脚注 3

XML Schema注釈xdb:defaultTableSchemaxdb:maintainOrderxdb:SQLCollSchemaおよびxdb:SQLSchemaは、Oracle Databaseリリース12c (12.1.0.1)から非推奨になりました。

脚注 4

XML Schemaデータ型のSQLデータ型へのマッピング方法

関連項目:

オブジェクト・リレーショナル記憶域のXMLType表を手動で作成する場合の記憶域オプションの指定の詳細は、「XML Schemaに基づくデータのオブジェクト・リレーショナル記憶域」を参照してください。

表18-2 グローバルなcomplexType要素を宣言する要素内の注釈

属性 デフォルト 説明
xdb:maintainDOM

PL/SQL:

enableMaintainDom
disableMaintainDom

true | false

true

trueの場合、この要素のインスタンスは出力でDOM再現性が保持されるように格納されます。これは、要素の順序の他に、すべてのコメント、処理命令、ネームスペース宣言などが保持されることを意味します。

falseの場合は、出力で入力と同じDOM操作が保持されない場合があります。

xdb:SQLSchemaFoot 5

非推奨。適用可能なPL/SQLなし。

任意のSQLユーザー名

XML Schemaを登録するユーザー

SQLTypeによって指定された型を所有するデータベース・ユーザー(データベース・スキーマ)の名前を指定します。

xdb:SQLType

PL/SQL:

setSQLType
removeSQLType

任意のSQLデータ型脚注 6(NCHARNVARCHAR2およびNCLOB除く)

要素名から生成された名前

このXML要素の宣言に対応するSQL型の名前。

脚注 5

XML Schema注釈xdb:SQLSchemaは、Oracle Databaseリリース12c (12.1.0.1)から非推奨になりました。

脚注 6

XML Schemaデータ型のSQLデータ型へのマッピング方法

表18-3 XML Schema宣言内の注釈

属性 デフォルト 説明
xdb:mapUnboundedStringToLobFoot 7

適用可能なPL/SQLなし。

true | false

false

trueの場合は、デフォルトで、無制限の文字列がCLOBインスタンスにマップされます。同様に、デフォルトで、無制限のバイナリ・データがBLOB値にマップされます。

falseの場合は、無制限の文字列がVARCHAR2(4000)値にマップされ、無制限のバイナリ・コンポーネントがRAW(2000)値にマップされます。

xdb:storeVarrayAsTableFootref 7

非推奨。適用可能なPL/SQLなし。

true | false

true

trueの場合は、VARRAYが表(OCT)として格納されます。デフォルト値はtrueです。

falseの場合は、VARRAYがLOBに格納されます。

脚注7

XML Schema注釈xdb:mapUnboundedStringToLobおよびxdb:storeVarrayAsTableは、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。

18.2.5 オブジェクト・リレーショナル記憶域に対するXML Schema注釈のガイドライン

オブジェクト・リレーショナル形式で格納されるXMLTypeデータでは、パフォーマンスを最適化するために注意深い計画が求められます。エンティティ関連モデル、索引付け、データ型、表パーティションなどのリレーショナル・データについても、同様の点を考慮することが求められます。XPathリライトを有効にし、最適なパフォーマンスを達成するには、XML Schema注釈を使用してこのような多くの設計選択を実装します。

18.2.5.1 未使用の最上位要素に不要な表作成の回避

対応するXMLインスタンスの最上位でXML Schemaの最上位の要素が使用されない場合は、注釈xdb:defaultTable = ""をXML Schemaの要素に追加することで、関連する表を作成せずに済みます。この属性の空の値により、デフォルト表の作成を回避できます。

XML Schema登録では、スキーマで定義される最上位の要素ごとに、デフォルトで、最上位の表が作成されます。そのような要素の中には、スキーマに準拠するXMLインスタンスで最上位で使用されるものもあります。たとえば、XML Schemaの要素は、REFターゲットとして使用するために最上位になることがあります。

PL/SQLプロシージャDBMS_XMLSCHEMA_ANNOTATE.disableDefaultTableCreationを使用して、空のxdb:defaultTable属性を、xdb:defaultTable属性を持たない最上位の各要素に追加できます。

注意:

任意のインスタンス・ドキュメントのルート要素として使用されるXML Schemaの最上位要素はすべて、空でないxdb:defaultTable属性を持つ必要があります。

関連項目:

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

18.2.5.2 デフォルト表に対する独自の名前の提供

チューニング用に、問合せの実行計画の出力を検証します。これは、オブジェクト・リレーショナル形式で格納されているXMLTypeデータの基礎となる表を参照します。これらの表には、システム生成された名前がデフォルトで含まれます。対象とする表の場合は特に、かわりに独自の表名を指定することをお薦めします。

これを行うには、注釈xdb:defaultTableを使用します。

18.2.5.3 不要な場合のDOM再現性の無効化

デフォルトでは、XML Schemaの登録で、DOM再現性を維持する表が生成されます。多くの場合、これはデータ中心のXMLデータのDOM再現性が必要でない場合です。かわりに、DOM再現性を維持しないオブジェクト・リレーショナル表を使用することで、格納、問合せおよびデータ変更のパフォーマンスを改善できます。

これを行うには、注釈xdb:maintainDOM = "false"を使用します。

関連項目:

「DOM再現性」

18.2.5.4 タイムスタンプ・データ型を使用した時間関連要素の注釈

アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、xs:time型およびxs:dateTime型のXML Schema要素に、xdb:SQLType = "TIMESTAMP WITH TIME ZONE"の注釈を指定します。これによって、タイムゾーン・インジケータが含まれている値の格納、取出しおよび比較を実行できます。

18.2.5.5 表および列のプロパティの追加

オブジェクト・リレーショナルXMLTypeデータの基礎となる表または列に、パーティションや表領域、圧縮などの追加のプロパティを指定する必要がある場合は、注釈xdb:tablePropsまたはxdb:columnPropsを使用します。これを行うことにより、主キーや制約などを追加できます。

たとえば、オンライン・トランザクション処理(OLTP)のために表の圧縮を行うには、tableProps属性を使用してCOMPRESS FOR OLTPを追加します。

関連項目:

XMLType表および列を手動で作成する際のOLTP圧縮の指定の例は例17-9

18.2.5.6 大規模コレクションの表外格納

大規模コレクションがある場合は、注釈xdb:defaultTableおよびxdb:SQLInlineを使用して、そのコレクション要素を表外に格納するように指定する必要がある場合があります。

complexTypeで定義される要素と属性の最大数は、1000です。その型のインスタンスが格納される場合、生成されるSQLオブジェクトを管理できる単一の表を作成することはできません。大規模コレクションがある場合は、1つの表でこのような1000列の上限にぶつかる可能性があります。

注釈xdb:defaultTableおよびxdb:SQLInlineを使用すると、このようなコレクション要素を表外に格納するように指定できます。つまり、これらのデータは個別の表に格納され、主となるコレクション表に格納されるのは、その表の行の参照のみです。表外の表の名前を指定するには、xdb:defaultTableを使用します。表外に格納するには、大規模コレクションの各要素に注釈xdb:SQLInline = "false"を指定します。

注意:

XML Schema内の継承階層または置換グループごとに表が作成され、その列には、該当する階層または置換グループのコンテンツ・モデルが格納されます。これも、1000列の上限に達する原因になる場合があります。

18.2.6 登録されたXML Schemaの問合せによる注釈の取得

データベース・ビューUSER_XML_SCHEMASおよびALL_XML_SCHEMASを問い合せると、登録されたXML Schemaとそれに附随するすべての注釈を取得できます。登録済のXML Schemaのバージョンには、Oracle XML DB注釈の完全なセットが含まれています。これらの注釈は、ユーザーが指定するか、XML Schemaの登録時にデフォルトで設定されます。

例18-6に、これを示します。XML SchemaがXMLTypeインスタンスとして戻されます。

例17-3および例17-4に示されているように、登録されているXML Schemaの場所は、XML Schemaがローカル・スキーマかグローバル・スキーマかによって異なります。特定の注釈情報をリレーショナル列に投影するには、RESOURCE_VIEWを問い合せることができます。例18-7に、これを示します。XMLTypeデータのオブジェクト・リレーショナル記憶域に対してXML Schemaで宣言されているグローバルなcomplexType定義、およびそれに対応するSQLオブジェクト型とDOM再現性値を取得します。

例18-6 登録されたXML Schemaを取得するビューUSER_XML_SCHEMASの問合せ

SELECT SCHEMA FROM USER_XML_SCHEMAS
  WHERE SCHEMA_URL = 'http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd';

例18-7 登録されたXML Schemaからのメタデータの問合せ

SELECT ct.xmlschema_type_name, ct.sql_type_name, ct.dom_fidelity
  FROM RESOURCE_VIEW,
       XMLTable(
         XMLNAMESPACES (
           'http://xmlns.oracle.com/xdb/XDBResource.xsd' AS "r",
           'http://xmlns.oracle.com/xdb/documentation/purchaseOrder' AS "po",
           'http://www.w3.org/2001/XMLSchema' AS "xs",
           'http://xmlns.oracle.com/xdb' AS "xdb"),
         '/r:Resource/r:Contents/xs:schema/xs:complexType' PASSING RES
         COLUMNS
           xmlschema_type_name VARCHAR2(30) PATH '@name',
           sql_type_name       VARCHAR2(30) PATH '@xdb:SQLType',
           dom_fidelity        VARCHAR2(6)  PATH '@xdb:maintainDOM') ct
  WHERE
    equals_path(
      RES,
      '/sys/schemas/SCOTT/xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd')
    =1;

XMLSCHEMA_TYPE_NAME        SQL_TYPE_NAME            DOM_FIDELITY
-------------------------  -----------------------  ------------
PurchaseOrderType          PURCHASEORDER_T          true
LineItemsType              LINEITEMS_T              true
LineItemType               LINEITEM_T               true
PartType                   PART_T                   true
ActionsType                ACTIONS_T                true
RejectionType              REJECTION_T              true
ShippingInstructionsType   SHIPPING_INSTRUCTIONS_T  true

7 rows selected.

18.2.6.1 あるXML Schemaから別のXML Schemaに適用可能な注釈

あるXML Schemaから別のXML Schemaに注釈を適用する必要が生じることがあります。たとえば、古いバージョンのスキーマから新しいバージョンに注釈を適用する場合などが一般的です。PL/SQLサブプログラムgetSchemaAnnotationsを使用して注釈を取得し、setSchemaAnnotationsを使用して注釈を設定できます。

PL/SQLファンクションgetSchemaAnnotationsにより、XML Schemaからすべての注釈が戻されます。PL/SQLプロシージャsetSchemaAnnotationsにより注釈が設定されます。これらのサブプログラムはPL/SQLパッケージDBMS_XMLSCHEMA_ANNOTATE内にあります。

関連項目:

PL/SQLサブプログラムgetSchemaAnnotationsおよびsetSchemaAnnotationsの詳細は、『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』の「DBMS_XMLSCHEMA_ANNOTATE」を参照してください。

18.3 DBMS_XMLSCHEMAを使用したXML Schemaデータ型のSQLデータ型へのマッピング

PL/SQLパッケージDBMS_XMLSCHEMAを使用して、XML Schema属性および要素のデータ型をSQLデータ型にマップします。

注意:

XML Schema登録時に、XML Schemaデータ型からマップされるSQLデータ型に直接アクセスしないでください。これらのSQL型はOracle XML DBの実装の一部です。ユーザーが使用できるように公開されたものではありません。オラクル社は製品パッチなどで、実装をいつでも変更する権利を留保します。オラクル社によるそうした変更は、XMLの抽象的概念に従うアプリケーションには影響しませんが、それらのデータ型に直接アクセスするアプリケーションには影響を与えることがあります。

18.3.1 XML Schemaデータ型のSQLへのマッピングの例

XML Schemaデータ型のSQLデータ型へのマッピングの例を示します。

例18-8では、属性SQLTypeを使用してデータ型のマッピングを指定します。また、属性SQLNameを使用して、様々なXML要素および属性に使用されるオブジェクト属性を指定します。

例18-8 属性SQLTypeを使用したXML Schemaデータ型のSQLデータ型へのマッピング

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xdb="http://xmlns.oracle.com/xdb"
           version="1.0">
  <xs:element name="PurchaseOrder" type="PurchaseOrderType" xdb:defaultTable="PURCHASEORDER"/>
  <xs:complexType name="PurchaseOrderType" xdb:SQLType="PURCHASEORDER_T">
    <xs:sequence>
      <xs:element name="Reference" type="ReferenceType" minOccurs="1" xdb:SQLName="REFERENCE"/>
      <xs:element name="Actions" type="ActionsType" xdb:SQLName="ACTIONS"/>
      <xs:element name="Reject" type="RejectionType" minOccurs="0" xdb:SQLName="REJECTION"/>
      <xs:element name="Requestor" type="RequestorType" xdb:SQLName="REQUESTOR"/>
      <xs:element name="User" type="UserType" minOccurs="1" xdb:SQLName="USERID"/>
      <xs:element name="CostCenter" type="CostCenterType" xdb:SQLName="COST_CENTER"/>
      <xs:element name="ShippingInstructions" type="ShippingInstructionsType" 
                  xdb:SQLName="SHIPPING_INSTRUCTIONS"/>
      <xs:element name="SpecialInstructions" type="SpecialInstructionsType" 
                  xdb:SQLName="SPECIAL_INSTRUCTIONS"/>
      <xs:element name="LineItems" type="LineItemsType" xdb:SQLName="LINEITEMS"/>
      <xs:element name="Notes" type="po:NotesType" xdb:SQLType="CLOB"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="LineItemsType" xdb:SQLType="LINEITEMS_T">
    <xs:sequence>
      <xs:element name="LineItem" type="LineItemType" maxOccurs="unbounded" 
                  xdb:SQLName="LINEITEM" xdb:SQLCollType="LINEITEM_V"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="LineItemType" xdb:SQLType="LINEITEM_T">
    <xs:sequence>
      <xs:element name="Description" type="DescriptionType" 
                  xdb:SQLName="DESCRIPTION"/>
      <xs:element name="Part" type="PartType" xdb:SQLName="PART"/>
    </xs:sequence>
    <xs:attribute name="ItemNumber" type="xs:integer" xdb:SQLName="ITEMNUMBER" 
                  xdb:SQLType="NUMBER"/>
  </xs:complexType>
  <xs:complexType name="PartType" xdb:SQLType="PART_T">
    <xs:attribute name="Id" xdb:SQLName="PART_NUMBER" xdb:SQLType="VARCHAR2">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:minLength value="10"/>
          <xs:maxLength value="14"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="Quantity" type="moneyType" xdb:SQLName="QUANTITY"/>
    <xs:attribute name="UnitPrice" type="quantityType" xdb:SQLName="UNITPRICE"/>
  </xs:complexType>

  ...

  <xs:complexType name="ActionsType" xdb:SQLType="ACTIONS_T">
    <xs:sequence>
      <xs:element name="Action" maxOccurs="4" xdb:SQLName="ACTION" xdb:SQLCollType="ACTION_V">
        <xs:complexType xdb:SQLType="ACTION_T">
          <xs:sequence>
            <xs:element name="User" type="UserType" xdb:SQLName="ACTIONED_BY"/>
            <xs:element name="Date" type="DateType" minOccurs="0" xdb:SQLName="DATE_ACTIONED"/>
          </xs:sequence>
        </xs:complexType>
      </xs:element>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="RejectionType" xdb:SQLType="REJECTION_T">
    <xs:all>
      <xs:element name="User" type="UserType" minOccurs="0" xdb:SQLName="REJECTED_BY"/>
      <xs:element name="Date" type="DateType" minOccurs="0" xdb:SQLName="DATE_REJECTED"/>
      <xs:element name="Comments" type="CommentsType" minOccurs="0" xdb:SQLName="REASON_REJECTED"/>
    </xs:all>
  </xs:complexType>
  <xs:complexType name="ShippingInstructionsType" xdb:SQLType="SHIPPING_INSTRUCTIONS_T">
    <xs:sequence>
      <xs:element name="name" type="NameType" minOccurs="0" xdb:SQLName="SHIP_TO_NAME"/>
      <xs:element name="address" type="AddressType" minOccurs="0" xdb:SQLName="SHIP_TO_ADDRESS"/>
      <xs:element name="telephone" type="TelephoneType" minOccurs="0" xdb:SQLName="SHIP_TO_PHONE"/>
    </xs:sequence>
  </xs:complexType>
  ...
</xs:schema>

18.3.2 XML Schema属性データ型のSQLへのマッピング

XML属性の宣言で、基本型、ローカルなsimpleType、グローバルなsimpleType、またはグローバル属性に対する参照(ref="..")によって、そのXML Schemaデータ型を指定できます。SQLデータ型とその関連する情報は、基本XML Schema型から導出されます。

属性の宣言では、次のいずれかを使用してXML Schemaデータ型を指定できます。

  • 基本型

  • このXML Schemaまたは外部のXML Schema内で宣言されたグローバルなsimpleType

  • このXML Schemaまたは外部のXML Schema内で宣言されたグローバル属性に対する参照(ref="..")

  • ローカルなsimpleType

SQLデータ型および関連付けられた情報(長さおよび精度)、メモリーのマッピングの情報は、属性の基礎となるsimpleTypeから導出されます。

18.3.2.1 属性を宣言する際に実行できるXML Schema内のSQLType値のオーバーライド

XML Schemaに注釈としてSQLTypeの値を明示的に指定できます。指定するSQLデータ型はXML Schemaの検証で使用されて、デフォルトのSQLデータ型がオーバーライドされます。

このようなSQLデータ型の次の特定の形式のオーバーライドのみが可能です。

  • デフォルトのSQLデータ型がSTRINGの場合、CHARVARCHARまたはCLOBでオーバーライドできます。

  • デフォルトのSQLデータ型がRAWの場合は、RAWまたはBLOBでオーバーライドできます。

18.3.3 XML Schema要素データ型のSQLへのマッピング

XML要素の宣言で、基本型、ローカルまたはグローバルなsimpleType、ローカルまたはグローバルなcomplexType、またはグローバル要素に対する参照(ref="..")を使用して、そのXML Schemaデータ型を指定できます。SQLデータ型とその関連する情報は、基本XML Schema型から導出されます。

要素の宣言では、次のいずれかを使用してXML Schemaデータ型を指定できます。

  • 属性の宣言に対して型を指定する方法のいずれか。「XML Schema属性データ型のSQLへのマッピング」を参照してください。

  • このXML Schema文書または外部のXML Schema内で指定されたグローバルなcomplexType

  • このXML Schema文書または外部のXML Schema内に存在するグローバル要素(ref="...")

  • ローカルなcomplexType

18.3.3.1 要素を宣言する際のXML Schema内のSQLType値のオーバーライド

デフォルトでは、complexTypeに基づく要素は、各サブ要素および属性に対応するオブジェクト属性が含まれるSQLオブジェクト型にマップされます。入力XML SchemaにSQLType属性を明示的に指定することによって、このマッピングをオーバーライドできます。

この場合、SQLTypeに対して次の値が使用できます。

  • VARCHAR2

  • RAW

  • CLOB

  • BLOB

これらの値によって、格納されたXMLデータはデータベース内でテキスト形式で表されます。

たとえば、SQLTypeVARCHAR2からCLOBにオーバーライドするには、xmlns:xdb="http://xmlns.oracle.com/xdb"を使用してからxdb:SQLType = "CLOB"を使用してxdb名前空間を宣言します。

特別な場合の処理を次に示します。

  • 要素の宣言に使用されるcomplexType値、およびcomplexType内で宣言された要素の処理中に循環が検出された場合、SQLInline属性は強制的にfalseに設定され、正しいSQLマッピングはREF XMLTYPEに設定されます。

  • maxOccurs > 1の場合は、VARRAY型を作成できます。

    • SQLInline ="true"の場合は、要素型が事前にSQL型に決定しているVARRAY型が作成されます。VARRAYのカーディナリティは、属性maxOccursの値に基づきます。属性SQLCollTypeを使用してVARRAY型の名前をユーザーが指定するか、そうしない場合は要素名から導出されます。

    • SQLInline = "false"の場合、SQLデータ型はXDB.XDB$XMLTYPE_REF_LIST_Tに設定されます。これは、XMLTypeインスタンスを参照するREF値の配列を表す事前に定義されたデータ型です。

  • 要素がグローバル要素の場合、またはSQLInline = "false"の場合は、デフォルト表が作成されます。デフォルト表の名前をユーザーが指定するか、そうしない場合は要素名から導出されます。

18.3.4 XML Schema simpleTypeのSQLへのマッピング

XML simpleTypeは、simpleTypeが定義された方法に応じて、様々な方法でSQLオブジェクト型にマップされます。

図18-1に、このようなマッピングの1つとして、XML文字列型のSQLのVARCHAR2またはCLOBへのマッピングを示します。

図18-1 simpleTypeのマッピング: XML文字列からSQLのVARCHAR2またはCLOB

図18-1の説明が続きます。
「図18-1 simpleTypeのマッピング: XML文字列からSQLのVARCHAR2またはCLOB」の説明

表18-4から表18-7までに、XML Schema定義に指定された、SQLへのXML Schema simpleTypeのデフォルトのマッピングを示します。

次に例を示します。

  • XML Schemaの基本型は最も近いSQLデータ型にマップされます。たとえば、DECIMALPOSITIVEINTEGERおよびFLOATは、すべてSQLのNUMBERにマップされます。

  • XML Schemaの列挙型は、単一RAW(n)オブジェクト属性を持つSQLオブジェクト型にマップされます。nの値は、列挙の宣言で使用可能な値の数によって決定されます。

  • XML Schemaのリストまたは共用体型はSQL文字列(VARCHAR2またはCLOB)データ型にマップされます。

表18-4 XML Schema文字列データ型のSQLへのマッピング

XML Schema文字列型 lengthまたはmaxLengthファセット デフォルトSQLデータ型 互換性のあるSQLデータ型

string

n

n < 4000の場合はVARCHAR2(n)、それ以外の場合はVARCHAR2(4000)

CHARCLOB

string

-

mapUnboundedStringToLob = "false"の場合は、VARCHAR2(4000)CLOB

CHARCLOB

表18-5 XML Schemaバイナリ・データ型(hexBinary/base64Binary)のSQLへのマッピング

XML Schemaバイナリ型 lengthまたはmaxLengthファセット デフォルトSQLデータ型 互換性のあるSQLデータ型

hexBinarybase64Binary

n

n < 2000の場合はRAW(n)、それ以外の場合はRAW(2000)

RAWBLOB

hexBinarybase64Binary

-

mapUnboundedStringToLob = "false"の場合はRAW(2000)BLOB

RAWBLOB

表18-6 SQLへのXML Schema数値基本型のデフォルトのマッピング

XML Schema simpleType デフォルトSQLデータ型 指定されたtotalDigits (m)、fractionDigits(n) 互換性のあるSQLデータ型

float

NUMBER

NUMBER(m+n,n)

FLOATDOUBLEBINARY_FLOAT

double

NUMBER

NUMBER(m+n,n)

FLOATDOUBLEBINARY_DOUBLE

decimal

NUMBER

NUMBER(m+n,n)

FLOATDOUBLE

integer

NUMBER

NUMBER(m+n,n)

NUMBER

nonNegativeInteger

NUMBER

NUMBER(m+n,n)

NUMBER

positiveInteger

NUMBER

NUMBER(m+n,n)

NUMBER

nonPositiveInteger

NUMBER

NUMBER(m+n,n)

NUMBER

negativeInteger

NUMBER

NUMBER(m+n,n)

NUMBER

long

NUMBER(20)

NUMBER(m+n,n)

NUMBER

unsignedLong

NUMBER(20)

NUMBER(m+n,n)

NUMBER

int

NUMBER(10)

NUMBER(m+n,n)

NUMBER

unsignedInt

NUMBER(10)

NUMBER(m+n,n)

NUMBER

short

NUMBER(5)

NUMBER(m+n,n)

NUMBER

unsignedShort

NUMBER(5)

NUMBER(m+n,n)

NUMBER

byte

NUMBER(3)

NUMBER(m+n,n)

NUMBER

unsignedByte

NUMBER(3)

NUMBER(m+n,n)

NUMBER

表18-7 XML Schema日時データ型のSQLへのマッピング

XML Schema日時型 デフォルトSQLデータ型 互換性のあるSQLデータ型

dateTime

TIMESTAMP

TIMESTAMP WITH TIME ZONEDATE

time

TIMESTAMP

TIMESTAMP WITH TIME ZONEDATE

date

DATE

TIMESTAMPWITHTIMEZONE

gDay

DATE

TIMESTAMPWITHTIMEZONE

gMonth

DATE

TIMESTAMPWITHTIMEZONE

gYear

DATE

TIMESTAMPWITHTIMEZONE

gYearMonth

DATE

TIMESTAMPWITHTIMEZONE

gMonthDay

DATE

TIMESTAMPWITHTIMEZONE

duration

VARCHAR2(4000)

なし

表18-8 SQLへのその他のXML Schema基本および派生データ型のデフォルトのマッピング

XML Schema基本および派生型 デフォルトSQLデータ型 互換性のあるSQLデータ型

boolean

RAW(1)

VARCHAR2

language(string)

VARCHAR2(4000)

CLOBCHAR

NMTOKEN(string)

VARCHAR2(4000)

CLOBCHAR

NMTOKENS(string)

VARCHAR2(4000)

CLOBCHAR

Name(string)

VARCHAR2(4000)

CLOBCHAR

NCName(string)

VARCHAR2(4000)

CLOBCHAR

ID

VARCHAR2(4000)

CLOBCHAR

IDREF

VARCHAR2(4000)

CLOBCHAR

IDREFS

VARCHAR2(4000)

CLOBCHAR

ENTITY

VARCHAR2(4000)

CLOBCHAR

ENTITIES

VARCHAR2(4000)

CLOBCHAR

NOTATION

VARCHAR2(4000)

CLOBCHAR

anyURI

VARCHAR2(4000)

CLOBCHAR

anyType

VARCHAR2(4000)

CLOBCHAR

anySimpleType

VARCHAR2(4000)

CLOBCHAR

QName

XDB.XDB$QNAME

なし

normalizedString

VARCHAR2(4000)

なし

token

VARCHAR2(4000)

なし

18.3.4.1 SQLTypeでサポートされないNCHAR、NVARCHAR2およびNCLOBのSQLType値

Oracle XML DBでは、NCHARNVARCHAR2およびNCLOBは、属性SQLTypeの値としてサポートされません。XML要素または属性の型にNCHARNVARCHAR2またはNCLOBを指定できません。また、ユーザー独自のデータ型を提供する場合は、これらのデータ型を使用しないでください。

18.3.4.2 simpleType: SQLのVARCHAR2またはCLOBへのXML文字列のマッピング方法

XML Schemaで、データ型が、maxLengthが4000未満の文字列として指定されている場合、このデータ型は、指定された長さのVARCHAR2オブジェクト属性にマップされます。スキーマにmaxLengthが指定されていない場合、XML Schemaデータ型はLOBのみにマップできます。

これは、ほとんどの文字列の値が小さく、LOBを必要とする値がわずかである場合は、あまり効率的ではありません。

関連項目:

表18-4

18.3.4.3 XML SchemaのタイムゾーンのSQLへのマッピング方法

アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、属性SQLTypeを使用して、SQL型をTIMESTAMP WITH TIME ZONEに指定してください。これによって、タイムゾーン・インジケータが含まれている値の適切な格納および取出しを実行できます。

次のXML Schemaデータ型では、オプションのタイムゾーン・インジケータをリテラル値の一部として使用できます。

  • xsd:dateTime

  • xsd:time

  • xsd:date

  • xsd:gYear

  • xsd:gMonth

  • xsd:gDay

  • xsd:gYearMonth

  • xsd:gMonthDay

デフォルトの場合、XML Schema登録では、xsd:dateTimexsd:timeはSQLデータ型TIMESTAMPにマップされ、他のすべての日付型はSQLデータ型DATEにマップされます。

SQLデータ型TIMESTAMPDATEには、タイムゾーン・インジケータを使用できません。このため、アプリケーションでタイムゾーン情報が必要な場合は、属性SQLTypeを使用して、SQLデータ型TIMESTAMP WITH TIME ZONEを指定する必要があります。次に例を示します。

<element name="dob" type="xsd:dateTime"
          xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
<attribute name="endofquarter" type="xsd:gMonthDay"
           xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
18.3.4.3.1 値の最後にZを使用したUTCタイムゾーンの指定

UTCタイムゾーンを表すために、XML Schemaのタイムゾーン・コンポーネントにZを指定できます。最後にZが付く値をSQL TIMESTAMP WITH TIME ZONEとして格納すると、そのタイムゾーンは実質的に+00:00として格納されます。取得したタイムゾーン値の最後には、元のZではなく、+00:00が付いています。

たとえば、入力XML文書の値が1973-02-12T13:44:32Zの場合、出力は1973-02-12T13:44:32.000000+00:00になります。

18.3.5 XML Schema complexTypeのSQLへのマッピング

XML complexTypeは、complexTypeが定義された方法に応じて、様々な方法でSQLオブジェクト型にマップされます。

XML Schemaを使用すると、次のようにcomplexTypeがSQLオブジェクト型にマップされます。

  • complexType内で宣言されたXML属性は、SQLオブジェクト属性にマップされます。XML属性を定義するsimpleTypeによって、対応するオブジェクト属性のSQLデータ型が決定されます。

  • complexType内で宣言されたXML要素も、SQLオブジェクト属性にマップされます。XML要素を定義するsimpleTypeまたはcomplexTypeによって、対応するオブジェクト属性のSQLデータ型が決定されます。

属性maxOccurs > 1でXML要素が宣言されると、それはSQLのcollection (オブジェクト)属性にマップされます。collectionは、VARRAY値(デフォルト、推奨)または順序付けられていない表(非推奨の属性xdb:maintainOrder脚注 8falseに設定されている場合)になります。VARRAY値のデフォルトの記憶域はOrdered Collection Table(OCT)です。非推奨の属性xdb:storeVarrayAsTable脚注8falseに設定することによって、かわりにLOB記憶域を選択できます。

18.3.5.1 complexType XML Schema宣言での属性の指定

グローバルなcomplexTypeに基づく要素がある場合は、complexType宣言に属性SQLTypeが指定されている必要があります。要素の宣言内に同じSQLType属性を含めることもできます。

グローバルなcomplexTypeに属性SQLTypeを指定しない場合、内部生成された名前を持つSQLType属性がOracle XML DBによって作成されます。このグローバルな型を参照する要素では、SQLTypeに異なる値を指定できません。次のコードが許容されます。

  <xs:complexType name="LineItemsType" xdb:SQLType="LINEITEMS_T">
    <xs:sequence>
      <xs:element name="LineItem" type="LineItemType" maxOccurs="unbounded" 
                  xdb:SQLName="LINEITEM" xdb:SQLCollType="LINEITEM_V"/>
    </xs:sequence>
  </xs:complexType>
  <xs:complexType name="LineItemType" xdb:SQLType="LINEITEM_T">
    <xs:sequence>
      <xs:element name="Description" type="DescriptionType" 
                  xdb:SQLName="DESCRIPTION"/>
      <xs:element name="Part" type="PartType" xdb:SQLName="PART"/>
    </xs:sequence>
    <xs:attribute name="ItemNumber" type="xs:integer" xdb:SQLName="ITEMNUMBER" 
                  xdb:SQLType="NUMBER"/>
  </xs:complexType>
  <xs:complexType name="PartType" xdb:SQLType="PART_T">
    <xs:attribute name="Id" xdb:SQLName="PART_NUMBER" xdb:SQLType="VARCHAR2">
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:minLength value="10"/>
          <xs:maxLength value="14"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
    <xs:attribute name="Quantity" type="moneyType" xdb:SQLName="QUANTITY"/>
    <xs:attribute name="UnitPrice" type="quantityType" xdb:SQLName="UNITPRICE"/>
  </xs:complexType>

18.4 Oracle XML DBでのcomplexTypeの拡張および制限

XML Schemaでは、complexTypeの値はcomplexContentおよびsimpleContentに基づいて宣言されます。Oracle XML DBでは、complexTypeに対する様々な拡張および制限が定義されます。

  • simpleContentは、simpleTypeの拡張として宣言されます。

  • complexContentは、次のいずれかとして宣言されます。

    • ベース型

    • complexTypeの拡張

    • complexTypeの制限

18.4.1 XML SchemaでのcomplexTypeの宣言: 継承の処理

complexTypeでは、Oracle XML DBが他の複合型を拡張する型と制限する型で異なるようにXML Schemaでの継承を処理します。

  • 他の複合型を拡張するように宣言された拡張型の場合、ベース型に対応するSQL型が現在のSQL型のスーパータイプとして指定されます。サブcomplexTypeに宣言された追加属性および要素のみが、サブ・オブジェクト型に属性として追加されます。

  • 他の複合型を制約するように宣言された拡張型の場合、サブ複合型に対するSQL型がそのベース型のSQL型と同じになるように設定されます。これは、SQLでは継承メカニズムを介したオブジェクト型の制限がサポートされないためです。すべての制約は、XML Schemaでの制限によるものです。

例18-9は、AddressというベースcomplexType、およびUSAddressIntlAddressという2つの拡張を定義するXML Schemaの登録を示しています。

注意:

対応するcomplexTypefinal属性が指定されるため、型intladdr_tfinal型として作成されます。デフォルトでは、すべてのcomplexTypesを他の型から拡張および制約できるため、すべてのSQLオブジェクト型がfinalではない型として作成されます。

CREATE TYPE addr_t AS OBJECT(SYS_XDBPD$ XDB.XDB$RAW_LIST_T,
                             "street" VARCHAR2(4000),
                             "city" VARCHAR2(4000)) NOT FINAL;
CREATE TYPE usaddr_t UNDER addr_t ("zip" VARCHAR2(4000)) NOT FINAL;
CREATE TYPE intladdr_t UNDER addr_t ("country" VARCHAR2(4000)) FINAL;

例18-10は、ベースのcomplexTypeAddress、およびcountry属性を指定できないようにする制限型LocalAddressを定義するXML Schemaの登録を示しています。

SQLでの継承は制限の概念がサポートされないため、制限されたcomplexTypeに対応するSQLデータ型は、親オブジェクト型の空のサブタイプになります。例18-10のXML Schemaでは、Oracle XML DBによって次のSQL型が生成されます。

CREATE TYPE addr_t AS OBJECT (SYS_XDBPD$ XDB.XDB$RAW_LIST_T,
                              "street"   VARCHAR2(4000),
                              "city"     VARCHAR2(4000),
                              "zip"      VARCHAR2(4000),
                              "country"  VARCHAR2(4000)) NOT FINAL;
CREATE TYPE usaddr_t UNDER addr_t;

例18-9 XML Schemaでの継承: complexTypeの拡張としてのcomplexContent

DECLARE
  doc VARCHAR2(3000) :=
    '<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                xmlns:xdb="http://xmlns.oracle.com/xdb">
       <xs:complexType name="Address" xdb:SQLType="ADDR_T">
         <xs:sequence>
           <xs:element name="street" type="xs:string"/>
           <xs:element name="city" type="xs:string"/>
         </xs:sequence>
       </xs:complexType>
       <xs:complexType name="USAddress" xdb:SQLType="USADDR_T">
         <xs:complexContent>
           <xs:extension base="Address">
             <xs:sequence>
               <xs:element name="zip" type="xs:string"/>
             </xs:sequence>
           </xs:extension>
         </xs:complexContent>
       </xs:complexType>
       <xs:complexType name="IntlAddress" final="#all" xdb:SQLType="INTLADDR_T">
         <xs:complexContent>
           <xs:extension base="Address">
             <xs:sequence>
               <xs:element name="country" type="xs:string"/>
             </xs:sequence>
           </xs:extension>
         </xs:complexContent>
       </xs:complexType>
     </xs:schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://www.oracle.com/PO.xsd',
    SCHAMEDOC => doc);
END;

例18-10 XML Schemaでの継承: complexTypeの制限

DECLARE
  doc varchar2(3000) :=
    '<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                xmlns:xdb="http://xmlns.oracle.com/xdb">
       <xs:complexType name="Address" xdb:SQLType="ADDR_T">
         <xs:sequence>
           <xs:element name="street" type="xs:string"/>
           <xs:element name="city" type="xs:string"/>
           <xs:element name="zip" type="xs:string"/>
           <xs:element name="country" type="xs:string" minOccurs="0"
                       maxOccurs="1"/>
         </xs:sequence>
       </xs:complexType>
       <xs:complexType name="LocalAddress" xdb:SQLType="USADDR_T">
         <xs:complexContent>
           <xs:restriction base="Address">
             <xs:sequence>
               <xs:element name="street" type="xs:string"/>
               <xs:element name="city" type="xs:string"/>
               <xs:element name="zip" type="xs:string"/>
               <xs:element name="country" type="xs:string" 
                           minOccurs="0" maxOccurs="0"/>
             </xs:sequence>
           </xs:restriction>
         </xs:complexContent>
       </xs:complexType>
     </xs:schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://www.oracle.com/PO.xsd',
    SCHEMADOC => doc);
END;

18.4.2 simpleContentに基づくcomplexTypeのオブジェクト型へのマッピング

simpleContent宣言に基づく複合型は、XML属性に対応する属性および本体の値に対応する追加のSYS_XDBBODY$属性を持つオブジェクト型にマップされます。本体属性のデータ型は、本体の型を定義するsimpleTypeに基づきます。

例18-11のXML Schemaでは、Oracle XML DBによって次の型が生成されます。

CREATE TYPE obj_t AS OBJECT(SYS_XDBPD$ XDB.XDB$RAW_LIST_T, 
                            SYS_XDBBODY$ VARCHAR2(4000));

例18-11 XML SchemaのcomplexType: simpleContentへのcomplexTypeのマッピング

DECLARE
  doc VARCHAR2(3000) :=
    '<schema xmlns="http://www.w3.org/2001/XMLSchema"               
             targetNamespace="http://www.oracle.com/emp.xsd"      
             xmlns:emp="http://www.oracle.com/emp.xsd" 
             xmlns:xdb="http://xmlns.oracle.com/xdb"> 
       <complexType name="name" xdb:SQLType="OBJ_T"> 
         <simpleContent> 
           <restriction base="string"> 
           </restriction> 
         </simpleContent> 
       </complexType>
     </schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://www.oracle.com/emp.xsd',
    SCHEMADOC => doc);
END;

18.4.3 anyおよびanyAttribute宣言のオブジェクト型属性へのマッピング

Oracle XML DBでは、要素の宣言であるanyおよび属性の宣言であるanyAttributeは、作成されたオブジェクト型のVARCHAR2属性(またはオプションでラージ・オブジェクト(LOB))にマップされます。オブジェクト属性によって、any宣言に一致するXMLフラグメントのテキストが格納されます。

  • コンテンツが指定された名前空間に属するように、namespace属性を使用してコンテンツを制限できます。

  • any要素宣言内のprocessContents属性は、any宣言に一致するコンテンツに必要な検証レベルを示します。

例18-12のコードでは、オブジェクト型obj_tで、any要素が宣言されて列SYS_XDBANY$にマップされます。また、属性processContentsany宣言に一致するコンテンツを検証しないことも宣言されます。

例18-12のXML Schemaでは、Oracle XML DBによって次の型が生成されます。

CREATE TYPE obj_t AS OBJECT(SYS_XDBPD$ XDB.XDB$RAW_LIST_T,
                            Name VARCHAR2(4000), 
                            Age NUMBER, 
                            SYS_XDBANY$ VARCHAR2(4000));

例18-12 XML Schema: any/anyAttributeへのcomplexTypeのマッピング

DECLARE
  doc VARCHAR2(3000) :=
    '<schema xmlns="http://www.w3.org/2001/XMLSchema"  
             targetNamespace="http://www.oracle.com/any.xsd" 
             xmlns:emp="http://www.oracle.com/any.xsd" 
             xmlns:xdb="http://xmlns.oracle.com/xdb">
       <complexType name="Employee" xdb:SQLType="OBJ_T">
         <sequence>
           <element name="Name" type="string"/>
           <element name="Age" type="decimal"/>
           <any namespace="http://www/w3.org/2001/xhtml"
                processContents="skip"/>
         </sequence>
       </complexType>
     </schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://www.oracle.com/emp.xsd',
    SCHEMADOC => doc);
END;

18.5 XML Schemaに基づくXMLType列および表の作成

XML SchemaがOracle XML DBに登録された後は、XMLType表または列を定義するときにそれを参照できます。

XML Schemaに基づくデータを格納するXMLType表または列を作成する際に、記憶域モデルを指定しない場合、使用される記憶域モデルは、参照するXML Schemaの登録時に指定した記憶域モデルです。XML Schemaの登録時に記憶域モデルを指定しなかった場合は、オブジェクト・リレーショナル形式の記憶域が使用されます。

例18-13に、PurchaseOrder要素のデフォルト表である表purchaseorderを手動で作成する方法を示します。

例18-13CREATE TABLE文は、XML Schema登録の際、パラメータGENTABLESTRUEに設定すると、Oracle XML DBにより自動生成されるCREATE TABLE文と同等です。

例18-13で使用されているXML Schemaでは、表purchaseOrderPurchaseOrder要素のデフォルト表であることが指定されています。XML Schemaに準拠するXML文書を、プロトコルまたはPL/SQLを使用してOracle XML DBリポジトリに挿入すると、その文書のコンテンツはpurchaseorder表に行として格納されます。

XML Schemaをグローバル・スキーマとして登録した場合は、デフォルト表に対する適切なアクセス権をデータベースのすべてのユーザーに付与する必要があります。これによって、ユーザーは、グローバルに登録したXML Schemaに準拠するインスタンス・ドキュメントを操作できるようになります。

Action要素のコレクションを管理するVARRAYの各メンバーは、Ordered Collection Table、action_tableに格納されます。LineItem要素のコレクションを管理するVARRAYの各メンバーは、Ordered Collection Table、lineitem_tableに行として格納されます。Ordered Collection Tableはヒープに基づいています。PRIMARY KEY指定のため、表には親の列に逆リンクするのに必要な疑似列NESTED_TABLE_IDおよび列SYS_NC_ARRAY_INDEX$が自動的に含まれます。

デフォルトでは、(非推奨の) XML Schema注釈xdb:storeVarrayAsTable脚注 9の値はtrueで、XML Schema登録時に、コレクションに対してOrdered Collection Tables (OCT)を自動生成します。このOCTにはシステムが生成した、覚えにくい名前が付けられます。SQL文RENAME TABLEを使用して、わかりやすい名前を付けることができます。

例18-13CREATE TABLE文は、単一レベルのネストが行われている発注書に対応しています。LineItem要素のコレクションを管理するVARRAYは、Ordered Collection Table、lineitem_tableです。

ここで、別のXML Schemaを想定し、Shipment要素のコレクションがShipments要素内にあり、この要素がLineItem要素内にあるとします。この場合は、例18-14に示すように、表を手動で作成できます。

例18-15に示すように、SQL*PlusのDESCRIBE文を使用すると、XMLType表に関する情報を表示できます。

例18-15DESCRIBE文の出力には、purchaseorder表に関する次の情報が表示されます。

  • 表はXMLType表です。

  • 表は、XML Schema PurchaseOrderで定義されたPurchaseOrder文書の格納用に制限されます。

  • この表の行は、データベースに一連のオブジェクトとして格納されます。

  • SQL型purchaseorder_tは、この表のベース・オブジェクトです。

例18-13 XML Schemaに準拠したXMLType表の作成

CREATE TABLE purchaseorder OF XMLType
  XMLSCHEMA "http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd"
  ELEMENT "PurchaseOrder"
  VARRAY "XMLDATA"."ACTIONS"."ACTION"
    STORE AS TABLE action_table 
                   ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$)))
  VARRAY "XMLDATA"."LINEITEMS"."LINEITEM"
    STORE AS TABLE lineitem_table 
                   ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$)));

例18-14 ネストしたコレクションのXMLType表の作成

CREATE TABLE purchaseorder OF XMLType
  XMLSCHEMA "http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd"
  ELEMENT "PurchaseOrder"
  VARRAY "XMLDATA"."ACTIONS"."ACTION"
    STORE AS TABLE action_table 
                   ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$)))
                   VARRAY "XMLDATA"."LINEITEMS"."LINEITEM"
    STORE AS TABLE lineitem_table 
                   ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$))
                    VARRAY "SHIPMENTS"."SHIPMENT"
                      STORE AS TABLE shipments_table
                                     ((PRIMARY KEY (NESTED_TABLE_ID,
                                                    SYS_NC_ARRAY_INDEX$))));

例18-15 XML Schemaに基づくXMLType表でのDESCRIBEの使用

DESCRIBE purchaseorder
 Name                                      Null?    Type
 ----------------------------------------- -------- ----------------------------
TABLE of SYS.XMLTYPE(XMLSchema
"http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd"
Element "PurchaseOrder") STORAGE Object-relational TYPE "PURCHASEORDER_T"

18.6 オブジェクト・リレーショナル形式で格納されたXMLTypeの表および列のパーティション化の概要

オブジェクト・リレーショナル形式のXMLType表またはオブジェクト・リレーショナル形式で格納されているXMLType列を含む表をパーティション化したり、リスト、レンジまたはハッシュのパーティション化を使用すると、デフォルトでデータ内のOrdered Collection Table (OCT)や表外の表もそれに応じて自動的にパーティション化されます。

この同一レベル・パーティション化は、OCTや表外の表のパーティション化がその親表(実表)のパーティション化スキームに準拠することを意味します。実表のパーティションごとに、対応する子表パーティションが存在します。子要素は、その親要素の実表パーティションに対応する子表パーティションに格納されます。

デフォルトでは、実表パーティションの記憶域属性が、対応する子表のパーティションにも使用されます。特定の子表パーティションについて、これらの記憶域属性を上書きできます。

同様に、デフォルトではOCTパーティションの名前はその実表(親表)と同じですが、この動作は使用する名前を指定することで上書きできます。表外の表パーティション名は、常に親表(実表またはOCT)のパーティションと同じです。

注意:

  • オブジェクト・リレーショナル形式で格納されたXMLTypeデータの同一レベル・パーティション化は、Oracle Database 11gリリース1(11.1)より前のリリースでは使用できません。

  • 表外に格納されたXMLTypeデータの同一レベル・パーティション化は、Oracle Database 11gリリース2(11.2.0.2)より前のリリースでは使用できません。そのリリース以降、表外に格納された表は共有されません。同じXML Schemaに基づく最上位の表は、そのスキーマが表外の表を指定する場合、2つ作成できません。

キーワードGLOBALCREATE TABLE文で指定すると、OCTのパーティション化を防ぐことができます。(Oracle Database 11gリリース1(11.1)以降は、デフォルト動作でキーワードLOCALが使用されます)。パーティション化されていないコレクション表からパーティション化されたコレクション表に変換する方法の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

表外の表のパーティション化を防いで、表外の共有を可能にするには、イベント31178をレベル0x200で有効にします。

ALTER SESSION SET EVENTS '31178 TRACE NAME CONTEXT FOREVER, LEVEL 0x200'

関連項目:

キーワードGLOBALおよびLOCALを使用してパーティション付きの表を作成する方法の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

18.6.1 XMLTypeデータのパーティション化の例

XML Schemaの登録中または表の作成中に、オブジェクト・リレーショナルXMLTypeの実表のパーティション化情報を指定できます。ここでは、この例を示します。

  • XML Schemaの登録時にXML Schema注釈xdb:tablePropsを使用

  • 表の作成時にCREATE TABLEを使用

例18-16および例18-17に、これを示します。これら2つの例では、結果はまったく同じです。実表purchaseorderが、レンジを指定するためにReference要素を使用してパーティション化されます。明細項目の子表が、実表に対して同一レベルでパーティション化されます。

例18-16は、実表および明細項目の子表をパーティション化するように注釈が付けられた、発注書XML SchemaのPurchaseOrder要素を示します。

例18-17では、例18-16と同じパーティション化を、実表purchaseorderの作成時に指定しています。

また例18-16例18-17は、個々の子表のパーティションのオブジェクト格納オプションを指定する方法も示しています。この場合は、STORAGE句で、子表の各パーティションごとに最初に14Mのエクステントを割り当てることを指定しています。

関連項目:

  • 「例A-2」

  • オブジェクト・リレーショナル形式のデータのパーティション化の詳細は、『Oracle Databaseオブジェクト・リレーショナル開発者ガイド』を参照してください。

  • パーティション化の詳細は、『Oracle Database VLDBおよびパーティショニング・ガイド』を参照してください。

例18-16 XML Schemaの登録時のパーティション化情報の指定

<xs:element name="PurchaseOrder" type="PurchaseOrderType"
            xdb:defaultTable="PURCHASEORDER"
            xdb:tableProps =
              "VARRAY XMLDATA.LINEITEMS.LINEITEM
                 STORE AS TABLE lineitem_table
                   ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$)))
                   PARTITION BY RANGE (XMLDATA.Reference)
                     (PARTITION p1 VALUES LESS THAN (1000)
                        VARRAY XMLDATA.LINEITEMS.LINEITEM
                          STORE AS TABLE lineitem_p1 (STORAGE (MINEXTENTS 13)),
                      PARTITION p2 VALUES LESS THAN (2000)
                        VARRAY XMLDATA.LINEITEMS.LINEITEM
                          STORE AS TABLE lineitem_p2 (STORAGE (MINEXTENTS 13)))"/>

例18-17 表の作成時のパーティション化情報の指定

CREATE TABLE purchaseorder OF XMLType
  XMLSCHEMA "http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd"
  ELEMENT "PurchaseOrder"
  VARRAY "XMLDATA"."LINEITEMS"."LINEITEM" STORE AS TABLE lineitem_table
    ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$)))
    PARTITION BY RANGE (XMLDATA.Reference)
      (PARTITION p1 VALUES LESS THAN (1000)
         VARRAY "XMLDATA"."LINEITEMS"."LINEITEM" STORE AS TABLE lineitem_p1
           (STORAGE (MINEXTENTS 13)),
       PARTITION p2 VALUES LESS THAN (2000)
         VARRAY  "XMLDATA"."LINEITEMS"."LINEITEM" STORE AS TABLE lineitem_p2
           (STORAGE (MINEXTENTS 13)));

18.6.2 パーティション・メンテナンス

子表のパーティションの定義やメンテナンスは、手動で行う必要はありません。実表(親表)に対してパーティション・メンテナンスを実行すると、対応するメンテナンスが子表に対しても自動的に実行されます。

ただし、実表に対してのみパーティション・メンテナンスを実行するというのは一般的なルールで、例外もあります。次のような場合は、子表に対してメンテナンスを実行します。

  • コレクション・パーティションのデフォルトの物理記憶域属性を変更する場合

  • コレクション・パーティションの物理記憶域属性を変更する場合

  • コレクション・パーティションを別のセグメント(または別の表領域のセグメント)に移動する場合

  • コレクション・パーティションの名前を変更する場合

たとえば、実表の表領域を変更した場合、その変更はその子表パーティションにカスケード処理されません。子表の表領域を変更するには、子表パーティションに対してALTER TABLE MODIFY PARTITIONを手動で使用する必要があります。

前述の例外的な操作を除き、パーティション・メンテナンスは、実表に対してのみ実行します。パーティションの追加、削除および分割などの操作を行います。

子表では、オンラインでのパーティション再定義もサポートされています。実表のオンラインでの再定義の際に、パーティション化されていない子表を、パーティション化された子表にコピーできます。通常は、新しく定義した子表の索引と制約を保護するために、PL/SQLプロシージャDBMS_REDEFINITION.copy_table_dependentsのパラメータ値copy_indexes => 0およびcopy_constraints => falseを指定します。

関連項目:

  • SQL文ALTER TABLEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

  • PL/SQLパッケージDBMS_REDEFINITIONを使用したオンラインでのパーティション再定義の詳細は、『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』を参照してください。

18.7 XMLType表および列に対するリレーショナル制約の指定

XMLTypeデータがオブジェクト・リレーショナル形式で格納されている場合は、XML文書内で1回のみ出現する要素および属性に対して、標準的なリレーショナル制約を指定できます。

例18-18では、標準データベース・スキーマOEにあるXMLTypepurchaseorderに、一意性制約と外部キー制約を定義しています。

OE.purchaseorder表の場合のように、オブジェクト・リレーショナル形式で格納されているXMLTypeデータの場合、制約は、XMLコンテンツを管理するために使用されるSQLデータ型のオブジェクト属性によって指定される必要があります。

例18-18は、バイナリXML表に一意性制約を定義している例3-8に似ています。ただし例18-18では、各OE.purchaseorder文書の要素Userが、標準データベース・スキーマHRの表employeesに含まれる従業員の電子メール・アドレスである必要があるという外部キー制約も追加して定義されています。

例3-8と同様に、例18-18の一意性制約reference_is_uniqueが要素Referenceの、表に格納されたすべてのドキュメントを通じての一意性を保証しています。外部キー制約user_is_validは、ここで要素Userの値がHR.employees表のemail列の値に対応することを保証しています。

XML文書DuplicateReference.xmlの要素Referenceに関連付けられたテキスト・ノードに、XML文書PurchaseOrder.xml内の対応するノードと同じ値が含まれています。したがって、両方の文書をOracle XML DBに格納しようとすると、制約reference_is_uniqueに違反します。

また、XML文書InvalidUser.xmlの要素Userに関連付けられたテキスト・ノードには、値HACKERが含まれています。表HR.employeesには、email列の値がHACKERのエントリはありません。この文書をOracle XML DBに格納しようとすると、外部キー制約user_is_validに違反します。

関連項目:

例18-18 オブジェクト・リレーショナル形式で格納されているXMLType表の整合性制約とトリガー

ALTER TABLE purchaseorder
  ADD CONSTRAINT reference_is_unique
  UNIQUE (XMLDATA."REFERENCE");
 
ALTER TABLE purchaseorder
  ADD CONSTRAINT user_is_valid
  FOREIGN KEY (XMLDATA."USERID") REFERENCES hr.employees(email);
 
INSERT INTO purchaseorder
  VALUES (XMLType(bfilename('XMLDIR', 'purchaseOrder.xml'),
                  nls_charset_id('AL32UTF8')));
 
INSERT INTO purchaseorder
  VALUES (XMLType(bfilename('XMLDIR', 'DuplicateReference.xml'),
                  nls_charset_id('AL32UTF8')));

INSERT INTO purchaseorder
*
ERROR at line 1:
ORA-00001: unique constraint (QUINE.REFERENCE_IS_UNIQUE) violated
 
INSERT INTO purchaseorder
  VALUES (XMLType(bfilename('XMLDIR', 'InvalidUser.xml'),
                  nls_charset_id('AL32UTF8')));

INSERT INTO purchaseorder
*
ERROR at line 1:
ORA-02291: integrity constraint (QUINE.USER_IS_VALID) violated - parent key not
 found

18.7.1 属性の親要素への一意制約の追加

複数回出現する要素に制約を作成するには、VARRAYをOrdered Collection Table(OCT)として格納します。したがって、OCTに対して制約を作成できます。たとえば、自己循環する要素(コレクション)の属性に基づいて一意キーを作成することが考えられます。

例18-19に示すXML Schemaを使用すると、要素<PhoneNumber>の属性Noが複数回出現します。この例は、指定のインスタンス・ドキュメント内で同一の電話番号を繰り返せないことを保証する一意制約を追加する方法を示しています。

この例の制約は、個々のコレクションに対して適用され、すべてのインスタンスには適用されません。制約は、コレクションID列を持つ連結索引を作成することで適用されます。全インスタンス・ドキュメントのコレクションすべてに制約を適用するには、コレクションID列を省略します。

注意:

バイナリXMLとして格納されたXMLTypeデータに対する一意キーまたは外部キーの制約としてのみ、機能上の制約を作成できます。

例18-19 属性の親要素への一意制約の追加

BEGIN DBMS_XMLSCHEMA.registerSchema(
  SCHEMAURL => 'emp.xsd',
  SCHEMADOC => '<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
                           xmlns:xdb="http://xmlns.oracle.com/xdb">
                  <xs:element name="Employee" xdb:SQLType="EMP_TYPE">
                    <xs:complexType>
                      <xs:sequence>
                        <xs:element name="EmployeeId" type="xs:positiveInteger"/>
                        <xs:element name="PhoneNumber" maxOccurs="10"/>
                          <xs:complexType>
                            <xs:attribute name="No" type="xs:integer"/>
                          </xs:complexType>
                        </xs:element>
                      </xs:sequence>
                    </xs:complexType>
                  </xs:element>
                </xs:schema>',
   LOCAL     => FALSE, 
   GENTYPES  => FALSE); 
END;/

PL/SQL procedure successfully completed.

CREATE TABLE emp_tab OF XMLType
  XMLSCHEMA "emp.xsd" ELEMENT "Employee"
  VARRAY XMLDATA."PhoneNumber" STORE AS TABLE phone_tab;

Table created.
ALTER TABLE phone_tab ADD UNIQUE (NESTED_TABLE_ID, "No");

Table altered.
INSERT INTO emp_tab 
  VALUES(XMLType('<Employee>
                    <EmployeeId>1234</EmployeeId>
                    <PhoneNumber No="1234"/>
                    <PhoneNumber No="2345"/>
                  </Employee>').createSchemaBasedXML('emp.xsd'));

1 row created.
INSERT INTO emp_tab 
  VALUES(XMLType('<Employee>
                    <EmployeeId>3456</EmployeeId>
                    <PhoneNumber No="4444"/>
                    <PhoneNumber No="4444"/>
                  </Employee>').createSchemaBasedXML('emp.xsd'));

これによって、予期した結果が戻ります。

*
ERROR at line 1:
ORA-00001: unique constraint (SCOTT.SYS_C002136) violated

18.8 XMLTypeデータの表外記憶域

デフォルトでは、XMLTypeデータがオブジェクト・リレーショナル形式で格納される場合、子要素は埋込みSQLオブジェクト属性にマップされます。ときには、XMLTypeデータの一部を表外に格納することによってパフォーマンスが向上する場合があります。XML Schema注釈xdb:SQLInlineを使用してこれを実行します。

18.8.1 表外に格納するための注釈属性xdb:SQLInlineのfalse設定

XMLフラグメントを表外に格納するには、XML Schema注釈xdb:SQLInlinefalseに設定します。この要素は、表外に格納されるXMLフラグメントに対応するXMLTypeの他のインスタンスを指す、埋込みREF属性を持つSQLオブジェクト型にマップされます。

デフォルトでは、XMLTypeデータがオブジェクト・リレーショナル形式で格納される場合、子XML要素は埋込みSQLオブジェクト属性にマップされます。ただし、表外に格納することによってパフォーマンスが向上する場合もあります。そのような場合は、XML Schema注釈(属性)xdb:SQLInlinefalseに設定すると、REF属性が埋め込まれたSQLオブジェクト型がOracle XML DBによって生成されます。REFは、表外に格納されるXMLフラグメントに対応するXMLTypeの他のインスタンスを指します。また、デフォルトのXMLType表が作成され、この表に表外のフラグメントが格納されます。

図18-2に、表外に格納するためのSQLへのcomplexTypeのマッピングを示します。

図18-2 表外に格納するためのSQLへのcomplexTypeのマッピング

図18-2の説明が続きます。
「図18-2 表外に格納するためのSQLへのcomplexTypeのマッピング」の説明

注意:

Oracle Database 11gリリース2(11.2.0.2)以降では、結果がan out-of-line tableとなるXML Schemaを使用するXMLType表を1つだけ作成できます。同じXML Schemaを使用する2つめの表を作成しようとすると、エラーが発生します。

例18-20では、要素Addrの属性xdb:SQLInlineの値はfalseです。結果のSQLオブジェクト型obj_t2には、埋込みREFオブジェクト属性を含むXMLType列があります。REF属性は、表addr_tabのSQLオブジェクト型obj_t1XMLTypeインスタンスを指します。表addr_tabは表外に格納されます。列streetおよびcityが含まれます。

このXML Schemaを登録すると、Oracle XML DBによって、例18-21の型およびXMLType表が生成されます。

emp_tabには全従業員の情報が格納され、表外の、表addr_tabに格納されている住所情報を指すオブジェクト参照が含まれています。

このモデルのメリットは、表外の表(addr_tab)を直接問い合せ、住所情報を参照できることです。例18-22は、全従業員について固有の都市情報を取得するために、表addr_tabを直接問い合せる場合を示しています。

この格納モデルのデメリットは、Employee要素全体を取得するために、住所に関する別の表にアクセスする必要がある点です。

例18-20 表外に格納するためのSQLInLineのfalse設定

DECLARE
  doc VARCHAR2(3000) :=
    '<schema xmlns="http://www.w3.org/2001/XMLSchema"                     
             targetNamespace="http://www.oracle.com/emp.xsd"       
             xmlns:emp="http://www.oracle.com/emp.xsd"       
             xmlns:xdb="http://xmlns.oracle.com/xdb">
       <complexType name="EmpType" xdb:SQLType="EMP_T">
         <sequence>
           <element name="Name" type="string"/>
           <element name="Age" type="decimal"/>
           <element name="Addr" 
                    xdb:SQLInline="false"
                    xdb:defaultTable="ADDR_TAB">
             <complexType xdb:SQLType="ADDR_T">
               <sequence>
                 <element name="Street" type="string"/>
                 <element name="City" type="string"/>
               </sequence>
             </complexType>
           </element>
         </sequence>
       </complexType>
       <element name="Employee" type="emp:EmpType"
                xdb:defaultTable="EMP_TAB"/>
     </schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL        => 'emp.xsd',
    SCHEMADOC        => doc,
    ENABLE_HIERARCHY => DBMS_XMLSCHEMA.ENABLE_HIERARCHY_NONE);
END;
/

例18-21 生成されたXMLType表および型

DESCRIBE emp_tab
 Name                          Null?    Type
 ----------------------------- -------- ----------------------------------------------------------
TABLE of SYS.XMLTYPE(XMLSchema "emp.xsd" Element "Employee") STORAGE Object-relational TYPE "EMP_T"
 
DESCRIBE addr_tab
 Name                          Null?    Type
 ----------------------------- -------- --------------------------------------------------------
TABLE of SYS.XMLTYPE(XMLSchema "emp.xsd" Element "Addr") STORAGE Object-relational TYPE "ADDR_T"

DESCRIBE emp_t
 emp_t is NOT FINAL
 Name                          Null?    Type
 ----------------------------- -------- --------------------
 SYS_XDBPD$                             XDB.XDB$RAW_LIST_T
 Name                                   VARCHAR2(4000 CHAR)
 Age                                    NUMBER
 Addr                                   REF OF XMLTYPE

DESCRIBE addr_t
 Name                          Null?    Type
 ----------------------------- -------- --------------------
 SYS_XDBPD$                             XDB.XDB$RAW_LIST_T
 Street                                 VARCHAR2(4000 CHAR)
 City                                   VARCHAR2(4000 CHAR)
 

例18-22 表外の表の問合せ

INSERT INTO emp_tab
  VALUES
    (XMLType('<x:Employee
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:x="http://www.oracle.com/emp.xsd"
                 xsi:schemaLocation="http://www.oracle.com/emp.xsd emp.xsd">
                <Name>Abe Bee</Name>
                <Age>22</Age>
                <Addr>
                  <Street>A Street</Street>
                  <City>San Francisco</City>
                </Addr>
              </x:Employee>'));
 
INSERT INTO emp_tab
  VALUES
    (XMLType('<x:Employee
                 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                 xmlns:x="http://www.oracle.com/emp.xsd"
                 xsi:schemaLocation="http://www.oracle.com/emp.xsd emp.xsd">
                <Name>Cecilia Dee</Name>
                <Age>23</Age>
                <Addr>
                  <Street>C Street</Street>
                  <City>Redwood City</City>
                </Addr>
              </x:Employee>'));
. . .
SELECT DISTINCT XMLCast(XMLQuery('/Addr/City' PASSING OBJECT_VALUE AS "." 
                                              RETURNING CONTENT)
                       AS VARCHAR2(20))
  FROM addr_tab;

CITY
-------------
Redwood City
San Francisco

18.8.2 表外の表へのコレクションの格納

表外にコレクション項目を格納できます。親要素には、単一のREF列ではなく、コレクションのメンバーを指すREF値のVARRAYが挿入されます。

たとえば、各従業員の住所リストがあり、そのリストが例18-23に示すように表外の記憶域にマップされているとします。

このXML Schemaの登録中に、Oracle XML DBでは例18-20に示すように、emp_tabおよびaddr_tab、型emp_tおよびaddr_tが生成されます。しかし、このときは、例18-24に示すように、型emp_tには単一のREF属性ではなく、住所を指すREF値のVARRAYが含まれます。

デフォルトでは、(非推奨の) XML Schema属性xdb:storeVarrayAsTable脚注 10は値trueを持ち、これはREF値のVARRAYが表外の中間表に格納されることを意味します。XML Schemaの登録では、取り上げた表および型の作成に加えて、REF値のリストを格納する中間表も作成されるということです。この表にはシステムが生成した名前が付けられますが変更することができます。これは索引を作成する場合などに役立つことがあります。

例18-26は、サンフランシスコを拠点とする全従業員の名前と居住している町を選択する問合せを示しています。この例では、City要素で住所表を問い合せ、従業員表を使用して逆方向に結合します。示されている実行計画の断片は、表emp_tab_reflistemp_tabの間の結合を示しています。

パフォーマンスを向上するには、REF値の索引を中間表emp_tab_reflistに作成します。これによって、Oracle XML DBは、住所表を問い合せて、関連する行へのオブジェクト参照(REF)を取得し、そのオブジェクト参照をREF値のリストが格納されている中間表に結合し、従業員表を使用してその中間表を逆方向に結合することができます。

REF範囲指定または参照制約がある場合にのみ、REF値に索引を作成できます。範囲指定されたREF列には、特定の表内のオブジェクトへのポインタのみが格納されます。表emp_tab_reflistREF値は、表addr_tab内のオブジェクトのみを参照するので、例18-27に示すように、REF列に有効範囲制約および索引を作成できます。

例18-23 コレクションの表外格納

DECLARE
  doc VARCHAR2(3000) :=
    '<schema xmlns="http://www.w3.org/2001/XMLSchema"
             targetNamespace="http://www.oracle.com/emp.xsd"
             xmlns:emp="http://www.oracle.com/emp.xsd"
             xmlns:xdb="http://xmlns.oracle.com/xdb">
       <complexType name="EmpType" xdb:SQLType="EMP_T">
         <sequence>
           <element name="Name" type="string"/>
           <element name="Age" type="decimal"/>
           <element name="Addr" xdb:SQLInline="false"
                    maxOccurs="unbounded" xdb:defaultTable="ADDR_TAB">
             <complexType xdb:SQLType="ADDR_T">
               <sequence>
                 <element name="Street" type="string"/>
                 <element name="City" type="string"/>
               </sequence>
             </complexType>
           </element>
         </sequence>
       </complexType>
       <element name="Employee" type="emp:EmpType"
                xdb:defaultTable="EMP_TAB"/>
     </schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL        => 'emp.xsd',
    SCHEMADOC        => doc,
    ENABLE_HIERARCHY => DBMS_XMLSCHEMA.ENABLE_HIERARCHY_NONE);
END;
/

例18-24 生成された表外のコレクション型

DESCRIBE emp_t
 emp_t is NOT FINAL
 Name                                   Null?    Type
 -------------------------------------- -------- --------------------------
 SYS_XDBPD$                                      XDB.XDB$RAW_LIST_T
 Name                                            VARCHAR2(4000 CHAR)
 Age                                             NUMBER
 Addr                                            XDB.XDB$XMLTYPE_REF_LIST_T

例18-25 REF値の中間表名の変更

DECLARE
  gen_name VARCHAR2 (4000);
BEGIN
  SELECT TABLE_NAME INTO gen_name FROM USER_NESTED_TABLES
    WHERE PARENT_TABLE_NAME = 'EMP_TAB';
  EXECUTE IMMEDIATE 'RENAME "' || gen_name || '"TO emp_tab_reflist';
END;
/
 
DESCRIBE emp_tab_reflist
 Name                    Null?    Type
 ----------------------- -------- ----------------
 COLUMN_VALUE                     REF OF XMLTYPE

例18-26 表外のコレクションのXPathリライト

SELECT em.name, ad.street
  FROM emp_tab,
       XMLTable(XMLNAMESPACES ('http://www.oracle.com/emp.xsd' AS "x"),
                '/x:Employee' PASSING OBJECT_VALUE
                COLUMNS name   VARCHAR2(20) PATH 'Name') em,
       XMLTable(XMLNAMESPACES ('http://www.oracle.com/emp.xsd' AS "x"),
                '/x:Employee/Addr' PASSING OBJECT_VALUE
                COLUMNS street VARCHAR2(20) PATH 'Street',
                        city   VARCHAR2(20) PATH 'City') ad
  WHERE ad.city = 'San Francisco';
 
NAME                 STREET
-------------------- --------------------
Abe Bee              A Street
Eve Fong             E Street
George Hu            G Street
Iris Jones           I Street
Karl Luomo           K Street
Marina Namur         M Street
Omar Pinano          O Street
Quincy Roberts       Q Street
 
8 rows selected.
|   4 |    TABLE ACCESS FULL         | EMP_TAB_REFLIST |    32 |   640 |     2   (0)| 00:00:01 |
|   5 |   TABLE ACCESS BY INDEX ROWID| EMP_TAB         |     1 |    29 |     1   (0)| 00:00:01 |
|*  6 |    INDEX UNIQUE SCAN         | SYS_C005567     |     1 |       |     0   (0)| 00:00:01 |

例18-27 REFへの索引を使用した表外のコレクションのXPathリライト

ALTER TABLE emp_tab_reflist ADD SCOPE FOR (COLUMN_VALUE) IS addr_tab;
CREATE INDEX reflist_idx ON emp_tab_reflist (COLUMN_VALUE);

例18-26と同じ問合せの実行計画の断片は、reflist_idxが取得されることを示しています。

|   4 |    TABLE ACCESS BY INDEX ROWID| EMP_TAB_REFLIST |     1 |    20 |     1   (0)| 00:00:01 |
|*  5 |     INDEX RANGE SCAN          | REFLIST_IDX     |     1 |       |     0   (0)| 00:00:01 |
|   6 |   TABLE ACCESS BY INDEX ROWID | EMP_TAB         |       |       |            |          |
|*  7 |    INDEX UNIQUE SCAN          | SYS_C005567     |     1 |       |     0   (0)| 00:00:01 |

18.9 複雑または大規模なXML Schemaの操作の考慮事項

XML Schemaは複雑になることがあります。複雑なスキーマの例として、再帰的なスキーマや循環参照を含むスキーマなどがあります。複雑または大規模なXML Schemaの操作は困難で、いくつかの点を考慮する必要があります。

18.9.1 XML Schema間での循環依存

W3C XML Schema勧告では、complexTypesおよびグローバル要素に再帰的参照を挿入できます。この種の構造では、対象の要素が再帰的階層で無限に出現する可能性があるインスタンス・ドキュメントを使用できます。

たとえば、complexType定義に、同じcomplexTypeに基づく要素を含めることができます。またはグローバル要素に自己参照を含めることができます。いずれの場合も、直接または間接的な参照にできます。

例18-28 循環依存を使用したXML Schema

<?xml version="1.0" encoding="UTF-8"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"
           xmlns:xdb="http://xmlns.oracle.com/xdb" 
           elementFormDefault="qualified" attributeFormDefault="unqualified">
  <xs:element name="person" type="personType" xdb:defaultTable="PERSON_TABLE"/>
  <xs:complexType name="personType" xdb:SQLType="PERSON_T">
    <xs:sequence>
      <xs:element name="descendant" type="personType" minOccurs="0"  
                  maxOccurs="unbounded" xdb:SQLName="DESCENDANT"
                  xdb:defaultTable="DESCENDANT_TABLE"/>
    </xs:sequence>
    <xs:attribute name="personName" use="required" xdb:SQLName="PERSON_NAME"> 
      <xs:simpleType>
        <xs:restriction base="xs:string">
          <xs:maxLength value="20"/>
        </xs:restriction>
      </xs:simpleType>
    </xs:attribute>
  </xs:complexType>
</xs:schema>

例18-28のXML Schemaには、循環依存が含まれています。complexType personTypeは、personName属性およびdescendant要素のコレクションで構成されます。descendant要素は、personTypeの実体として定義されます。

18.9.1.1 XML Schemaの循環依存のためのパラメータGenTablesのTRUE設定

Oracle XML DBでは、循環スキーマ依存を含むXML Schemaをサポートしています。循環を検出して使用不可にし、XML Schema登録時に作成された別々のXMLType表に再帰的要素を行として格納することで、このサポートを実現しています。

したがって、この種の構造を定義するXML Schemaを登録する場合は、パラメータgenTablesTRUEに設定されていることが重要です。再帰的要素の格納に使用する表の名前は、XML Schemaにxdb:defaultTable注釈を追加することで指定できます。

18.9.1.2 XML SchemaでのcomplexTypeの宣言: 循環の処理

SQLオブジェクト型では、循環を使用できません。オブジェクト型の生成時、循環が完了した時点でREF属性を設定することによって、XML Schemaでの循環が使用不可になります。データの一部は表外に格納されていますが、親であるXML文書の一部として取得されます。

注意:

Oracle Database 11gリリース2(11.2.0.2)以降では、結果がan out-of-line tableとなるXML Schemaを使用するXMLType表を1つだけ作成できます。同じXML Schemaを使用する2つめの表を作成しようとすると、エラーが発生します。

XML Schemaでは、複合型の定義間に循環を設定できます。図18-3にこれを示します。複合型CT1の定義は別の複合型CT2を参照でき、CT2の定義は最初の型CT1を参照します。

XML Schemaでは、複合型の定義間に循環を設定できます。例18-29では、長さが2の循環が作成されます。

SQL型では、型の定義で循環を使用できません。ただし、REF(参照)オブジェクト属性を伴う循環など、弱い循環はサポートされます。必要に応じて強制的にSQLInline="false"を設定することで循環を回避し、循環するXML Schema定義はSQLオブジェクト型にマップされます。これによって、弱いSQL循環が作成されます。

例18-29のXML Schemaでは、Oracle XML DBによって次の型が生成されます。

CREATE TYPE ct1 AS OBJECT (SYS_XDBPD$  XDB.XDB$RAW_LIST_T,
                           "e1"        VARCHAR2(4000),
                           "e2"        REF XMLType) NOT FINAL;
CREATE TYPE ct2 AS OBJECT (SYS_XDBPD$  XDB.XDB$RAW_LIST_T,
                           "e1"        VARCHAR2(4000),
                           "e2"        CT1) NOT FINAL;

図18-3 同じXML Schemaの異なるcomplexType間での相互参照

図18-3の説明が続きます。
「図18-3 同じXML Schemaの異なるcomplexType間での相互参照」の説明

循環する複合型に、自己参照する複合型の宣言が含まれる場合があります。例18-30では、SectionT型が自己参照しています。

例18-30のXML Schemaでは、Oracle XML DBによって次の型が生成されます。

CREATE TYPE body_coll AS VARRAY(32767Foot 11) OF VARCHAR2(32767Footref 11);
CREATE TYPE section_t AS OBJECT (SYS_XDBPD$  XDB.XDB$RAW_LIST_T, 
                                 "title"     VARCHAR2(32767Footref 11),
                                 "body"      BODY_COLL,
                                 "section"   XDB.XDB$REF_LIST_T) NOT FINAL;

注意:

例18-30では、オブジェクト属性sectionXMLTypeインスタンスへのREF参照のVARRAYとして宣言されます。埋込みセクションが複数存在する可能性があるので、属性はVARRAYになります。これはSQLオブジェクトの循環が構成されないようにするためにも、属性はXMLTypeインスタンスのREF参照のVARRAYになります。

図18-4に、スキーマでのcomplexTypeの自己参照の方法を示します。

図18-4 XML Schema内での複合型の自己参照

図18-4の説明が続きます。
「図18-4 XML Schema内での複合型の自己参照」の説明

例18-29 XML Schema: complexType間での循環

DECLARE 
  doc VARCHAR2(3000) :=
    '<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
                xmlns:xdb="http://xmlns.oracle.com/xdb">
       <xs:complexType name="CT1" xdb:SQLType="CT1">
         <xs:sequence>
           <xs:element name="e1" type="xs:string"/>
           <xs:element name="e2" type="CT2"/>
         </xs:sequence>
       </xs:complexType>
       <xs:complexType name="CT2" xdb:SQLType="CT2">
         <xs:sequence>
           <xs:element name="e1" type="xs:string"/>
           <xs:element name="e2" type="CT1"/>
         </xs:sequence>
       </xs:complexType>
     </xs:schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://www.oracle.com/emp.xsd',
    SCHEMADOC => doc);
END;

例18-30 XML Schema: complexType間での循環、自己参照

DECLARE 
  doc VARCHAR2(3000) :=
    '<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema"        
                xmlns:xdb="http://xmlns.oracle.com/xdb">
       <xs:complexType name="SectionT" xdb:SQLType="SECTION_T">
         <xs:sequence>
           <xs:element name="title" type="xs:string"/>
           <xs:choice maxOccurs="unbounded">
             <xs:element name="body" type="xs:string" 
                         xdb:SQLCollType="BODY_COLL"/>
             <xs:element name="section" type="SectionT"/>
           </xs:choice>
         </xs:sequence>
       </xs:complexType>
     </xs:schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://www.oracle.com/section.xsd',
    SCHEMADOC => doc);
END;

18.9.1.3 XML Schema間での循環参照

XML Schemaどうしを、通常の方法で逐次的に登録できないように、相互に依存させることができます。

これを図18-5に示します。

図の上半分は、3つのXML Schema間の間接循環参照の例を示しています。

図の下半分は、2つのXML Schema間の循環依存の例を示しています。最初に、この簡単な例の詳細を説明します。

図18-5 XML Schema間での循環参照

図18-5の説明が続きます。
「図18-5 XML Schema間での循環参照」の説明

他のXML Schemaを含むXML Schemaは、その含まれるXML Schemaが存在しない場合には作成できません。xm40a.xsdが存在しない場合、例18-31のXML Schema xm40.xsdの登録は失敗します。

ただし、例18-32に示すように、オプションFORCE => TRUEを指定した場合は、XML Schema xm40.xsdを作成できます。

ただし、例18-33のように、XML Schema xm40.xsdを使用しようとすると失敗します。

例18-34に示すように、FORCEオプションを使用してxm40a.xsdも登録すると、CREATE TABLE文で示されるように、両方のXML Schemaを使用できます。

したがって、相互に依存するこれらのXML Schemaを登録するには、次のように各スキーマのDBMS_XMLSCHEMA.registerSchemaFORCEパラメータを使用する必要があります。

  1. xm40.xsdを、FORCEモードをTRUEに設定して登録します。

    DBMS_XMLSCHEMA.registerSchema("xm40.xsd", "<schema ...", ..., FORCE => TRUE)
    

    この時点では、xm40.xsdを使用できません

  2. xm40a.xsdを、FORCEモードをTRUEに設定して登録します。

    DBMS_XMLSCHEMA.registerSchema("xm40a.xsd", "<schema ...", ..., FORCE => TRUE)
    

    これによってxm40.xsdが自動的にコンパイルされ、両方のXML Schemaが有効になります。

例18-31 存在しないXML Schemaを含むXML Schema

BEGIN DBMS_XMLSCHEMA.registerSchema(
  SCHEMAURL => 'xm40.xsd',
  SCHEMADOC => '<schema xmlns="http://www.w3.org/2001/XMLSchema"
                        xmlns:my="xm40"  
                        targetNamespace="xm40">
                  <include schemaLocation="xm40a.xsd"/>
                  <!-- Define a global complextype here -->
                  <complexType name="Company">
                    <sequence>
                      <element name="Name" type="string"/>
                      <element name="Address" type="string"/>
                    </sequence>
                  </complexType>
                  <!-- Define a global element depending on included schema -->
                  <element name="Emp" type="my:Employee"/>
                </schema>',
  LOCAL     => TRUE, 
  GENTYPES  => TRUE, 
  GENTABLES => TRUE); 
END;
/

例18-32 FORCEオプションを使用したXML Schema xm40.xsdの登録

BEGIN DBMS_XMLSCHEMA.registerSchema(
  SCHEMAURL => 'xm40.xsd',
  SCHEMADOC => '<schema xmlns="http://www.w3.org/2001/XMLSchema"
                        xmlns:my="xm40"  
                        targetNamespace="xm40">
                  <include schemaLocation="xm40a.xsd"/>
                  <!-- Define a global complextype here -->
                  <complexType name="Company">
                    <sequence>
                      <element name="Name" type="string"/>
                      <element name="Address" type="string"/>
                    </sequence>
                  </complexType>
                  <!-- Define a global element depending on included schema -->
                  <element name="Emp" type="my:Employee"/>
                </schema>',
  LOCAL     => TRUE, 
  GENTYPES  => TRUE, 
  GENTABLES => TRUE, 
  FORCE     => TRUE); 
END;
/

例18-33 循環するXML Schemaを使用した表作成の試行

CREATE TABLE foo OF XMLType XMLSCHEMA "xm40.xsd" ELEMENT "Emp";

例18-34 FORCEオプションを使用したXML Schema xm40a.xsdの登録

BEGIN DBMS_XMLSCHEMA.registerSchema(
  SCHEMAURL => 'xm40a.xsd',
  SCHEMADOC => '<schema xmlns="http://www.w3.org/2001/XMLSchema"
                        xmlns:my="xm40" 
                        targetNamespace="xm40">
                  <include schemaLocation="xm40.xsd"/>
                  <!-- Define a global complextype here -->
                  <complexType name="Employee">
                    <sequence>
                      <element name="Name" type="string"/>
                      <element name="Age" type="positiveInteger"/>
                      <element name="Phone" type="string"/>
                    </sequence>
                  </complexType>
                  <!-- Define a global element depending on included schema -->
                  <element name="Comp" type="my:Company"/>
                </schema>',
  LOCAL     => TRUE, 
  GENTYPES  => TRUE, 
  GENTABLES => TRUE, 
  FORCE     => TRUE); 
END;
/
CREATE TABLE foo  OF XMLType XMLSCHEMA "xm40.xsd"  ELEMENT "Emp";
CREATE TABLE foo2 OF XMLType XMLSCHEMA "xm40a.xsd" ELEMENT "Comp";
 

18.9.2 再帰的スキーマのサポート

表外の表の再帰構造に対するREFにより、コンパイル時に構造の深さがわからなくなるため、XPath問合せのリライトが困難になる場合があります。XPathリライトを可能にするには、再帰構造でDOCID列がルート文書を指すようにします。

これにより、一部のXPath問合せで表外の表を直接使用して、この列を使用して後戻り結合できるようになります。

文書が相互に関連する再帰的な問合せは、'//'を含むXPath式またはXQuery式、およびXMLTypeインスタンスを受け入れるSQL関数を使用する問合せです。文書が相互に関連する再帰的な問合せは、次の条件の両方を満たすことが問合せのコンパイル時に決定できる場合は、リライトできます。

  • XPath式またはXQuery式のターゲットとなるXMLTypeインスタンスのすべてのフラグメントが単一の表外の表に存在すること。

  • XMLTypeインスタンスの他のフラグメントが同じ表外の表に存在しないこと。

リライトされた問合せは、DOCID列に基づいて表外の表と結合されます。

'//'を持つその他の問合せもリライトできます。たとえば、スキーマの異なるセクションにある、すべて同じ型のaddress要素がいくつかある場合に、ドキュメント内の場所を特定せずに'//'を持つすべてのaddress要素を頻繁に問合せする場合は、リライトが発生する可能性があります。

スキーマの登録中に、追加のDOCID列が表外のXMLType表に生成されます。この列には文書のOID (Object Identifier Values)つまりルート要素が格納されます。この列はデータが表に挿入されると自動的に移入されます。DOCID列を含む表をエクスポートし、後でそれをインポートできます。

例18-35 再帰的XML Schema

<schema targetNamespace="AbcNS" xmlns="http://www.w3.org/2001/XMLSchema"
          xmlns:abc="AbcNS" xmlnm:xdb="http://xmlns.oracle.com.xdb">
  <element name="AbcCode" xdb:defaultTable="ABCCODETAB">
    <complexType>
      <sequence>
        <element ref="abc:AbcSection"/>
      </sequence>
    </complexType>
  </element>
 
  <element name="AbcSection">
    <complexType>
      <sequence>
        <element name="ID" type="integer"/>
        <element name="Contents" type="string"/>
        <element ref="abc:AbcSection"/>
      </sequence>
    </complexType>
  </element>
</schema>

18.9.2.1 一般的な表外の要素間で共有されるdefaultTable

同じ修飾名(名前空間およびローカル名)と同じ型の表外の要素は、同じデフォルト表に格納されます。特殊な場合として、循環型要素構造のルート要素を、サブ要素と同じ表の表外に格納できます。

デフォルト表を共有する両方の要素は表外の要素である必要があります。つまり、表外の要素のデフォルト表は最上位要素の表と同じにできません。同じにするには、両方の要素にxdb:SQLInline = "false"を指定し、両方の要素に同じ値を持つ明示的なxdb:defaultTable属性を指定します。

例18-36は、表外の表がABCSECTIONTABに格納されているXML Schemaを示しています。

例18-36の表外のAbcSection要素は、両方とも同じデフォルト表ABCSECTIONTABを共有しています。

ただし、例18-37は、デフォルト表の無効な共有を示しており、再帰的要素(XyZSection)は同じ表外の表を共有しません。

次の問合せはリライトできません。

SELECT XMLQuery('//XyzSection' PASSING OBJECT_VALUE RETURNING CONTENT)
  FROM xyzcode;

例18-36 表外の表

<schema targetNamespace="AbcNS" xmlns="http://www.w3.org/2001/XMLSchema"
           xmlns:abc="AbcNS" xmlns:xdb="http://xmlns.oracle.com/xdb">
  <element name="AbcCode" xdb:defaultTable="ABCCODETAB">
    <complexType>
      <sequence>
        <element ref="abc:AbcSection" xdb:SQLInline="false"/>
      </sequence>
    </complexType>
  </element>
 
  <element name="AbcSection" xdb:defaultTable="">
    <complexType>
      <sequence>
        <element name="ID" type="integer"/>
        <element name="Contents" type="string"/>
        <element ref="abc:AbcSection" xdb:SQLInline="false"
                 xdb:defaultTable="ABCSECTIONTAB"/>
      </sequence>
    </complexType>
  </element>
</schema>

例18-37 デフォルト表の無効な共有

 <schema targetNamespace="XyzNS" xmlns="http://www.w3.org/2001/XMLSchema"
         xmlns:xyz="XyzNS" xmlns:xdb="http://xmlns.oracle.com/xdb">
   <element name="XyzCode" xdb:defaultTable="XYZCODETAB">
   <complexType>
   <sequence>
      <element name="CodeNumber" type="integer" minOccurs="0"/>
      <element ref="xyz:XyzChapter" xdb:SQLInline="false"/>
      <element ref="xyz:XyzPara" xdb:SQLInline="false" />
   </sequence>
   </complexType>
   </element>
 
    <element name="XyzChapter" xdb:defaultTable="XYZCHAPTAB">
     <complexType>
     <sequence>
         <element name="Title" type="string"/>
         <element ref="xyz:XyzSection" xdb:SQLInline="false" 
                  xdb:defaultTable="XYZSECTIONTAB"/>
      </sequence>
      </complexType>
    </element>
 
    <element name="XyzPara" xdb:defaultTable="XYZPARATAB">
     <complexType>
     <sequence>
         <element name="Title" type="string"/>
         <element ref="xyz:XyzSection" xdb:SQLInline="false" 
                  xdb:defaultTable="Other_XYZSECTIONTAB"/>
      </sequence>
      </complexType>
    </element>
   
    <element name="XyzSection">
    <complexType>
    <sequence>
        <element name="ID" type="integer"/>
        <element name="Contents" type="string"/>
        <element ref="xyz:XyzSection" xdb:defaultTable="XYZSECTIONTAB"/>
     </sequence>
     </complexType>
    </element>
 </schema>

18.9.2.2 DOCIDが存在する場合の問合せのリライト

// XPath式を処理する前に、同じ要素が複数回出現していないか確認します。//の下にあるすべての出現が同じdefaultTableを共有する場合、DOCIDを使用した表に対して問合せをリライトできます。

//の下ではなく、その表を共有しているルートの下に、同じ要素の出現が他にある場合、問合せはリライトできません。

たとえば、次の要素構造を考えます。

<Book><Chapter>および<Part>を含む。<Part><Chapter>を含む。

両方の<Chapter>要素が表外に格納されており、同じデフォルト表を共有しているとします。/Book//Chapterという問合せは、<Book>の下にあるすべての<Chapter>要素は同じデフォルト表を共有するので、<Chapter>要素のデフォルト表に対してリライトできます。このため、このXPath問合せは、文書が相互に関連する再帰的なXPath問合せです。

ただし、<Part>の下にあるすべての<Chapter>要素が同じ表を共有している場合でも、/Book/Part//Chapterのような問合せはリライトできません。その理由は、<Book>(同様にその表を共有しているドキュメント・ルート)の下に別の<Chapter>があるからです。

例18-36のXML Schemaで説明したように、DOCIDが存在する状況で//AbcSectionの抽出を行う場合を考えます。

SELECT XMLQuery('//AbcSection' PASSING OBJECT_VALUE RETURNING CONTENT)
  FROM abccodetab;

両方のAbcSection要素が、同じ表abcsectiontabに格納されています。抽出は、基礎となるabcsectiontab表に対して適用されます。

DOCIDが存在する状況で次の問合せを考えます。

SELECT XMLQuery('/AbcCode/AbcSection//AbcSection'
                PASSING OBJECT_VALUE RETURNING CONTENT)
  FROM abccodetab;

前述の例とこの例の両方で、アクセス可能なすべてのAbcSection要素が同じ表外の表に格納されています。ただし、/AbcCode/AbcSectionにある最初のAbcSection要素は、この問合せでは取得できません。結合条件は、親ドキュメント内の異なる位置を区別できないDOCIDなので、表abcsectiontabに対する直接の問合せでは正しい結果が得られません。この場合、文書が相互に関連する再帰的なXPathではないので、問合せのリライトは発生しません。この最上位のAbcSectionがその他とともに表外に格納されていない場合、問合せをリライトできます。

18.9.2.3 DOCID列の作成の無効化

DBMS_XMLSCHEMA.registerSchemaを呼び出す際、OPTIONSパラメータを指定することで、DOCID列の作成を無効化できます。これにより、スキーマ登録時に生成されるすべてのXMLType表でDOCIDの作成が無効化されます。

OPTIONSは、データ型PLS_INTEGERの入力パラメータです。デフォルト値は0で、この場合オプションは使用されません。列DOCIDの生成を継承するには、パラメータOPTIONSDBMS_XMLSCHEMA.REGISTER_NODOCID (つまり1)に設定してください。

関連項目:

『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』

18.9.3 ラージ・オブジェクト(LOB)にマップできるXMLフラグメント

複合要素をCLOBまたはBLOBとして使用できるように、SQLデータ型を指定できます。

たとえば、図18-6では、XMLフラグメント全体がLOB属性に格納されます。

例18-38では、注釈SQLType = "CLOB"を使用して、XML Schemaで要素Addrを定義しています。

図18-6 CLOBインスタンスへのcomplexTypeのXMLフラグメントのマッピング

図18-6の説明が続きます。
「図18-6 CLOBインスタンスへのcomplexTypeのXMLフラグメントのマッピング」の説明

例18-38 Oracle XML DBのXML Schema: LOBへのcomplexTypeのXMLフラグメントのマッピング

DECLARE
  doc VARCHAR2(3000) :=
    '<schema xmlns="http://www.w3.org/2001/XMLSchema"       
             targetNamespace="http://www.oracle.com/emp.xsd"       
             xmlns:emp="http://www.oracle.com/emp.xsd"       
             xmlns:xdb="http://xmlns.oracle.com/xdb">
       <complexType name="Employee" xdb:SQLType="OBJ_T">
         <sequence>
           <element name="Name" type="string"/>
           <element name="Age" type="decimal"/>
           <element name="Addr" xdb:SQLType="CLOB">
             <complexType >
               <sequence>
                 <element name="Street" type="string"/>
                 <element name="City" type="string"/>
               </sequence>
             </complexType>
           </element>
         </sequence>
       </complexType>
     </schema>';
BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://www.oracle.com/PO.xsd',
    SCHEMADOC => doc);
END;

このXML Schemaを登録すると、Oracle XML DBによって、次の型およびXMLType表が生成されます。

CREATE TYPE obj_t AS OBJECT(SYS_XDBPD$ XDB.XDB$RAW_LIST_T, 
                            Name VARCHAR2(4000), 
                            Age NUMBER, 
                            Addr CLOB);

18.9.4 ORA-01792およびORA-04031: 大規模XML Schemaに関する問題

大規模または複雑なXML Schemaを操作すると、エラーORA-01792およびORA-04031が発生することがあります。これらは、XML Schemaを登録する際、またはXML Schemaによって定義されたグローバル要素に基づく表を作成する際に発生することがあります。

  • ORA-01792: 表またはビューに指定できる最大列数は1000です。

  • ORA-04031: 共有メモリーのstringバイトを割当てできません("string","string","string","string")

これらのエラーは、大多数の要素および属性の定義を含むcomplexTypeとしてグローバル要素が定義されているときに、グローバル要素に基づいてXMLType表または列を作成しようすると発生します。

これらは、オブジェクト・リレーショナル記憶域を使用するXMLType表または列を作成するときにのみ発生します。表または列はSQL型を使用して永続的に保持され、SQL型により定義された各オブジェクト属性は、基礎となる表の1つの列とみなされます。SQL型に別のSQL型に基づくオブジェクト属性が含まれる場合も、それらの型により定義された属性は基礎となる表の列とみなされます。

すべてのSQL型に含まれるオブジェクト属性の合計数がOracle Databaseの上限の1000列(1つの表で)を超えると、記憶域表は作成できません。complexTypeによって定義された要素と属性の総数が1000に達すると、その型のインスタンスがデータベースに格納される場合、生成されるSQLオブジェクトを管理できる単一の表を作成することはできません。

ヒント:

次の問合せを使用すると、オブジェクト・リレーショナル形式で格納されている特定のXMLType表の列数を特定できます。

SELECT count(*) FROM USER_TAB_COLS WHERE TABLE_NAME = '<the table>'

<the table>は、チェック対象の表です。

エラーORA-01792は、1000列の制限を超えたことを報告するものです。エラーORA-04031は、多数の要素および属性の定義の処理中にメモリーが不足していることを報告するものです。この要素および属性の定義が多すぎる問題を解決するには、記憶域表の作成に使用されるSQL型のオブジェクト属性の合計数を減らす必要があります。

削減を成功させるには、次の2つの方法があります。

  • XML文書を管理する複数の XMLTypeを使用する、トップダウン方法の使用。この方法は、指定した記憶域表について、SQL型階層内のSQL属性の数を減らします。いずれの表も管理するオブジェクト属性が1000を超えないかぎり、この問題は解決します。

  • SQL型の階層のSQL属性の数を減らし、XML Schemaにより定義された一部の要素および属性を縮小して、単一CLOB値として格納されるようにする、ボトムアップ方法の使用。

いずれの方法とも、XML Schemaに注釈を付けて、特定のcomplexTypeをデータベースに格納する方法を定義します。

トップダウン方法の場合は、SQLInline = "false"およびdefaultTableという注釈によって、XML文書内の一部のサブ要素が別のXMLType表に行として強制的に格納されます。Oracle XML DBは、XMLTypeREFを使用して2つの表の間の関係を保持します。この手法の適切な候補は、次のいずれかを実行するXML Schemaです。

  • 含まれる各要素がcomplexTypeとして定義される選択を定義

  • 多数の要素および属性の定義を含むcomplexTypeに基づいて要素を定義

ボトムアップ方法では、下位レベルの一部のcomplexType要素をオブジェクトとしてではなくCLOB値として格納することによって、SQLオブジェクト型の属性の数を減らします。これを行うには、complexTypeに注釈を付けるか、SQLType = "CLOB"を指定したcomplexTypeを使用します。

いずれの方法を使用するかは、アプリケーション、およびデータに対して実行される問合せと更新のタイプによって決まります。

18.9.5 コレクションでの大規模な文書のロードおよび取得の考慮事項

Oracle XML DB構成ファイルxdbconfig.xmlには、ロード操作で使用されるメモリー量を制御するパラメータ(xdbcore-loadableunit-sizeおよびxdbcore-xobmem-bound)があります。

これにより、次の条件が満たされた場合は、ロード処理を最適化できます。

  • 文書は次のいずれかの方法でロードされます。

    • プロトコル(FTP、HTTP(S)、DAV)

    • PL/SQL関数DBMS_XDB_REPOS.createResource

    • SQLのINSERT文をXMLType表に使用(XMLType列を除く)

  • 文書がXML Schemaに基づいており、大規模なコレクション(maxOccursが大きな数に設定されている要素)を含んでいること。

  • 文書のコレクションはOCTとして格納されていること。これがデフォルトの動作です。

次の場合は、最適化が部分的になることがあります。

  • 実表にトリガーがある。

  • 実表がパーティション化されている。

  • コレクションが表外に格納されている(SQLのINSERTのみに適用)。

この最適化の背景にある基本概念は、最適化によって、メモリーとの間で行うコレクションのスワップを、限定されたサイズで可能にすることです。この概念を示すために、発注書XML Schemaに準拠した次の例を考えてみます。

<PurchaseOrder>
  <LineItem itemID="1">
    ...
  </LineItem>
    .
    .
  <LineItem itemID="10240">
    ...
  </LineItem>
</PurchaseOrder>

この発注書文書には、10240のLineItem要素のコレクションが含まれています。文書全体をメモリー内で作成し、それをディスクにプッシュすると、メモリーが過度に使用され、場合によってはシステム・メモリーの不足によってロードの障害につながることがあります。

これを避けるには、ロード可能ユニットという限定されたメモリー・チャンク内に文書を作成します。

例では、各明細項目が1KBのメモリーを必要とし、それぞれに512KBのロード可能ユニットを使用することにします。それぞれのロード可能ユニットは512の明細項目を含み、こうしたユニットが約20あります。ドキュメントのメモリー表現全体を常に2MB以下にする必要がある場合は、メモリー内に保持されるロード可能ユニットがいつでも4ユニット以下となるようにする必要があります。LRUメカニズムを使用して、ロード可能ユニットをスワップ・アウトできます。

ロード可能ユニットのサイズおよび文書のサイズの限度を制御することで、ロードまたは取得時のメモリー使用量およびパフォーマンスをチューニングできます。通常、ロード可能ユニット・サイズが大きくなると、ディスクのアクセス数が少なくなりますが、必要なメモリーが増大します。これは構成パラメータxdbcore-loadableunit-sizeにより制御されます(デフォルト値は16KB)。文書に割り当てるメモリーの量は、パラメータxdbcore-xobmem-boundで指定できます(デフォルト値は1MB)。これらのパラメータの値はKBで指定します。つまり、xdbcore-xobmem-boundのデフォルト値は1024で、xdbcore-loadableunit-sizeのデフォルト値は16です。これらはメモリーを最適に使用する方法に関してシステムにガイドを提供するソフトな制限です。

FTPを使用して文書がロードされる場合、ロード可能ユニット(LU)が作成されてディスクにフラッシュされるパターンは次のようになります。

No LUs
Create LU1[LineItems(LI):1-512]
LU1[LI:1-512], Create LU2[LI:513-1024]
.
.
LU1[LI:1-512],...,Create LU4[LI:1517:2028]    <-   Total memory size = 2M
Swap Out LU1[LI:1-512], LU2[LI:513-1024],...,LU4[LI:1517-2028], Create LU5[LI:2029-2540]
Swap Out LU2[LI:513-1024], LU3, LU4, LU5, Create LU6[LI:2541-2052]
.
.
.
Swap Out LU16, LU17, LU18, LU10, Create LU20[LI:9729-10240]
Flush LU17,LU18,LU19,LU20

18.9.5.1 構成パラメータxdbcore-loadableunit-sizeおよびxdbcore-xobmem-boundのガイドライン

PGAサイズと試行錯誤により、構成パラメータxdbcore-loadableunit-sizeおよびxdbcore-xobmem-boundの最適な値を特定します。

一般に、アドレス指定可能なPGが1GBある場合は、PGAの10分の1を文書に割り当てます。アドレス指定可能なPGAが100MBある場合は、その10分の1をxobcore-xobmem-boundに設定します。文書の完全な取得およびロード中は、xdbcore-loadableunit-sizeの値をxobcore-xobmem-boundの値にできるかぎり近づけます。

最初はxdbcore-loadableunit-sizexdbcore-xobmem-bound(50MB)の半分の値に設定します。続いて文書をロードしてみます。

メモリーが不足したらxdbcore-xobmem-boundの値を減らし、xdbcore-loadableunot-sizeをその値の半分に設定します。このようにして、文書が正常にロードされるまで続けます。

ロード操作に成功したら、パフォーマンスをよくするためにxdbcore-loadableunit-sizeを上げます。xdbcore-loadableunit-sizexdbcore-xobmem-boundと等しい場合は、さらにパフォーマンスを向上させるために両方のパラメータ値を大きくします。

18.10 オブジェクト・リレーショナル形式で格納されたXMLデータのためのXML Schema登録のデバッグ

オブジェクト・リレーショナル形式で格納されるXMLデータの場合、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaを起動する前にイベント31098を設定することで、XML Schema登録中に作成されるオブジェクト型および表を監視できます。

ALTER SESSION SET EVENTS = '31098 TRACE NAME CONTEXT FOREVER'

このイベントを設定することで、すべてのCREATE TYPEおよびCREATE TABLE文のログが生成されます。このログは、ユーザー・セッション・トレース・ファイルに書き込まれます。このファイルは通常ORACLE_BASE/diag/rdbms/ORACLE_SID/ORACLE_SID/udumpにあります。このトレース出力は、XML Schemaの登録中の問題を診断するために役立ちます。



脚注の凡例

脚注1:

XML Schema注釈xdb:maintainOrderは、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。xdb:maintainOrder = "false"を使用すると、Ordered Collectionでなく、Unordered Collectionが使用されます。XMLデータの場合、ドキュメント内の順序を保持するために、Ordered Collection (xdb:maintainOrder = "true")を使用することをお薦めします。デフォルトで、属性xdb:maintainOrdertrueです。


脚注2:

XML Schema注釈xdb:storeVarrayAsTableは、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。


脚注8:

XML Schema注釈xdb:maintainOrderおよびxdb:storeVarrayAsTableは、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。


脚注9:

XML Schema注釈xdb:storeVarrayAsTableは、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。


脚注10:

XML Schema注釈xdb:storeVarrayAsTableは、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。


脚注11:

この値(32767)は、初期化パラメータMAX_STRING_SIZEEXTENDEDであることを前提としています。『Oracle Database SQL言語リファレンス』を参照してください。