XML Schemaに基づくデータに対する高度なテクニックには、オブジェクト・リレーショナル記憶域の使用、XML Schemaの注釈付け、XML Schemaデータ型のSQLへのマッピング、complexType
の拡張および制限の使用、XML Schemaに基づくデータの作成、XML Schemaに基づくデータに対するリレーショナル制約の指定およびXML Schemaに基づくデータのパーティション化、XMLType
データの表外格納、複雑または大規模なスキーマの操作、スキーマ登録のデバッグなどがあります。
関連項目:
Oracle XML DBでのXML Schemaの使用に関する基本情報は、XML Schemaの格納と問合せ: 基本を参照してください。
Oracle XML DBでのXPath式の最適化の詳細は、 オブジェクト・リレーショナル記憶域のXPathリライトを参照してください。
XML SchemaをOracle XML DBに登録した後で更新する方法の詳細は、 XML Schemaの拡張を参照してください。
http://www.w3.org/TR/xmlschema-0/
- XML Schemaの概要
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コンテンツの問合せおよび更新に必要なメモリーの量も削減できます。
Ordered Collectionは、ヒープに基づく表(推奨)と索引構成表(IOT)のいずれかにすることができるOrdered Collection Table (OCT)のVARRAYとして格納できます。データに対するREF
であるVARRAYエントリを使用して、実際のデータを表外に格納できます。
オブジェクト・リレーショナル形式で格納されるXMLType
データのXML Schemaを登録し、登録パラメータGENTABLES
をTRUE
に設定する場合、関連付けられた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.registerSchema
のOPTIONS
パラメータで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データの全文検索」を参照してください。
関連項目:
オブジェクト・リレーショナル記憶域を使用してXMLType
表および列を手動で作成する場合のコレクション記憶域の詳細は、「XML文書のオブジェクト・リレーショナル記憶域」を参照してください。
オブジェクト・リレーショナル形式で格納されている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
デフォルト表は、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"
一般的に、XML Schemaの登録中に自動的に生成されたSQL構造体(データ型、ネストされた表、および表外の記憶域に関連付けられている表)は、Oracle XML DB内部にあります。これらをコードで使用しないことをお薦めします。
より正確には、生成されたSQLデータ型、ネストされた表、および表外の記憶域に関連付けられている表は、Oracleによっていつでも変更および再定義される、特定の内部のXML Schemaとオブジェクト型のマッピングに基づいています。一般的に次が成立します。
生成されたSQLデータ型は使用しないでください。
生成されたネストされた表または表外へのアクセスまたは変更は行わないでください。
ただし、生成された表のパーティション化などの記憶域オプションは変更できます。また、生成された表に対して索引または制約を作成することはできます。また、生成された構造体に名前を付ける注釈など、Oracle XML DBに付属するXML Schema注釈は自由に使用できます。
XML Schemaの登録で生成されたSQL表、オブジェクト、属性の名前は、大/小文字が区別されます。
たとえば例18-2で、表PurchaseOrder1669_TAB
の名前は要素PurchaseOrder
の名前から導出されているため、これも大/小文字が混在しています。このため、この表を参照する際に識別子に引用符を使用("
PurchaseOrder1669_TAB
"
)する必要があります。使用しないと、ORA-00942: 表またはビューが存在しません
などの、オブジェクトが見つからないというエラーが発生します。
オブジェクト・リレーショナル形式で格納されている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列が存在しない場合、コメント、処理命令などの情報が失われる可能性があるためです。
関連項目:
DOM再現性と、XMLデータのバイナリXML記憶域の詳細は、「DOM再現性」を参照してください
XML Schemaに注釈を付けることによって、XML Schema登録処理によって生成されるオブジェクトおよび表に影響を与えることができます。これを行うには、Oracle特有の属性を、XML Schemaによって宣言されるcomplexType
、element
および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のルート要素で宣言することをお薦めします。
XML Schemaに注釈を付けてオブジェクト・リレーショナル表、オブジェクトおよびオブジェクト属性に名前を付けたり、XPath式の引数が再帰的なXMLデータをターゲットとしているときのXPathリライトを許可することができます。
XML Schemaに注釈を付ける一般的な理由は、次のとおりです。
XMLType
データのオブジェクト・リレーショナル記憶域に対してPL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
で作成された表やオブジェクト、オブジェクト属性の名前が、わかりやすくすべてのアプリケーション・ネーミング標準に準拠することを保証するため。この場合は、パラメータGENTYPES
またはGENTABLES
をTRUE
に設定します(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
値として格納する必要がある場合に定義するのが、一般的な使用方法です。注意: データ型NCHAR
、NVARCHAR2
またはNCLOB
は、SQLType
注釈の値としては使用できません。
xdb:SQLCollType
- 要素のコレクションを管理するVARRAY型を指定するために使用します。
xdb:maintainDOM
- 指定されているcomplexType
定義のDOM再現性を維持する必要があるかどうかを判断するために使用します。
これらの属性のいずれにも、値を指定する必要はありません。Oracle XML DBにより、デフォルトで、XML Schemaの登録プロセス中に適切な値が提供されます。ただし、オブジェクト・リレーショナル記憶域を使用する場合、少なくとも最上位のSQL型の名前を指定し、後で参照できるようにすることをお薦めします。
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_t
、lineitems_t
、lineitem_v
、lineitem_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.
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; /
要素と属性の宣言に指定できる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句 |
|
デフォルトの |
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:maintainDOM PL/SQL: enableMaintainDOM disableMaintainDOM |
|
|
|
xdb:maintainOrderFootref 3 非推奨。適用可能なPL/SQLなし。 |
|
|
|
xdb:SQLCollSchemaFootref 3 非推奨。適用可能なPL/SQLなし。 |
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
xdb:SQLCollType PL/SQL: setSQLCollType removeSQLCollType |
任意のSQLコレクション型 |
要素名から生成された名前 |
このXML要素に対応するSQLコレクション型の名前。XML要素は、 |
xdb:SQLInline PL/SQL: setOutOfLine removeOutOfLine |
|
|
|
xdb:SQLName PL/SQL: setSQLName removeSQLName |
SQL識別子 |
要素名 |
このXML要素にマップされるSQLオブジェクト内での属性の名前。 |
xdb:SQLSchemaFootref 3 非推奨。適用可能なPL/SQLなし。 |
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
xdb:SQLType PL/SQL: setSQLType removeSQLType |
任意のSQLデータ型脚注 4,( |
要素名から生成された名前 |
このXML要素の宣言に対応するSQL型の名前。 |
xdb:tableProps PL/SQL: setTableProps removeTableProps |
任意の表STORAGE句 |
|
デフォルトの |
脚注 3
XML Schema注釈xdb:defaultTableSchema
、xdb:maintainOrder
、xdb: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 |
|
|
|
xdb:SQLSchemaFoot 5 非推奨。適用可能なPL/SQLなし。 |
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
xdb:SQLType PL/SQL: setSQLType removeSQLType |
任意のSQLデータ型脚注 6( |
要素名から生成された名前 |
この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なし。 |
|
|
|
xdb:storeVarrayAsTableFootref 7 非推奨。適用可能なPL/SQLなし。 |
|
|
|
脚注7
XML Schema注釈xdb:mapUnboundedStringToLob
およびxdb:storeVarrayAsTable
は、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。
オブジェクト・リレーショナル形式で格納されるXMLType
データでは、パフォーマンスを最適化するために注意深い計画が求められます。エンティティ関連モデル、索引付け、データ型、表パーティションなどのリレーショナル・データについても、同様の点を考慮することが求められます。XPathリライトを有効にし、最適なパフォーマンスを達成するには、XML Schema注釈を使用してこのような多くの設計選択を実装します。
対応する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」を参照してください。
チューニング用に、問合せの実行計画の出力を検証します。これは、オブジェクト・リレーショナル形式で格納されているXMLType
データの基礎となる表を参照します。これらの表には、システム生成された名前がデフォルトで含まれます。対象とする表の場合は特に、かわりに独自の表名を指定することをお薦めします。
これを行うには、注釈xdb:defaultTable
を使用します。
デフォルトでは、XML Schemaの登録で、DOM再現性を維持する表が生成されます。多くの場合、これはデータ中心のXMLデータのDOM再現性が必要でない場合です。かわりに、DOM再現性を維持しないオブジェクト・リレーショナル表を使用することで、格納、問合せおよびデータ変更のパフォーマンスを改善できます。
これを行うには、注釈xdb:maintainDOM = "
false
"
を使用します。
関連項目:
アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、xs:time
型およびxs:dateTime
型のXML Schema要素に、xdb:SQLType = "
TIMESTAMP WITH TIME ZONE
"
の注釈を指定します。これによって、タイムゾーン・インジケータが含まれている値の格納、取出しおよび比較を実行できます。
オブジェクト・リレーショナルXMLType
データの基礎となる表または列に、パーティションや表領域、圧縮などの追加のプロパティを指定する必要がある場合は、注釈xdb:tableProps
またはxdb:columnProps
を使用します。これを行うことにより、主キーや制約などを追加できます。
たとえば、オンライン・トランザクション処理(OLTP)のために表の圧縮を行うには、tableProps属性を使用して
COMPRESS FOR OLTP
を追加します。
関連項目:
XMLType
表および列を手動で作成する際のOLTP圧縮の指定の例は例17-9
大規模コレクションがある場合は、注釈xdb:defaultTable
およびxdb:SQLInline
を使用して、そのコレクション要素を表外に格納するように指定する必要がある場合があります。
complexType
で定義される要素と属性の最大数は、1000です。その型のインスタンスが格納される場合、生成されるSQLオブジェクトを管理できる単一の表を作成することはできません。大規模コレクションがある場合は、1つの表でこのような1000列の上限にぶつかる可能性があります。
注釈xdb:defaultTable
およびxdb:SQLInline
を使用すると、このようなコレクション要素を表外に格納するように指定できます。つまり、これらのデータは個別の表に格納され、主となるコレクション表に格納されるのは、その表の行の参照のみです。表外の表の名前を指定するには、xdb:defaultTable
を使用します。表外に格納するには、大規模コレクションの各要素に注釈xdb:SQLInline = "
false
"
を指定します。
注意:
XML Schema内の継承階層または置換グループごとに表が作成され、その列には、該当する階層または置換グループのコンテンツ・モデルが格納されます。これも、1000列の上限に達する原因になる場合があります。
データベース・ビュー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.
ある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」を参照してください。
PL/SQLパッケージDBMS_XMLSCHEMA
を使用して、XML Schema属性および要素のデータ型をSQLデータ型にマップします。
注意:
XML Schema登録時に、XML Schemaデータ型からマップされるSQLデータ型に直接アクセスしないでください。これらのSQL型はOracle XML DBの実装の一部です。ユーザーが使用できるように公開されたものではありません。オラクル社は製品パッチなどで、実装をいつでも変更する権利を留保します。オラクル社によるそうした変更は、XMLの抽象的概念に従うアプリケーションには影響しませんが、それらのデータ型に直接アクセスするアプリケーションには影響を与えることがあります。
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>
XML属性の宣言で、基本型、ローカルなsimpleType
、グローバルなsimpleType
、またはグローバル属性に対する参照(ref=".."
)によって、そのXML Schemaデータ型を指定できます。SQLデータ型とその関連する情報は、基本XML Schema型から導出されます。
属性の宣言では、次のいずれかを使用してXML Schemaデータ型を指定できます。
基本型
このXML Schemaまたは外部のXML Schema内で宣言されたグローバルなsimpleType
このXML Schemaまたは外部のXML Schema内で宣言されたグローバル属性に対する参照(ref=".."
)
ローカルなsimpleType
SQLデータ型および関連付けられた情報(長さおよび精度)、メモリーのマッピングの情報は、属性の基礎となるsimpleType
から導出されます。
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
デフォルトでは、complexType
に基づく要素は、各サブ要素および属性に対応するオブジェクト属性が含まれるSQLオブジェクト型にマップされます。入力XML SchemaにSQLType属性を明示的に指定することによって、このマッピングをオーバーライドできます。
この場合、SQLType
に対して次の値が使用できます。
VARCHAR2
RAW
CLOB
BLOB
これらの値によって、格納されたXMLデータはデータベース内でテキスト形式で表されます。
たとえば、SQLType
をVARCHAR2
から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"
の場合は、デフォルト表が作成されます。デフォルト表の名前をユーザーが指定するか、そうしない場合は要素名から導出されます。
XML simpleType
は、simpleType
が定義された方法に応じて、様々な方法でSQLオブジェクト型にマップされます。
図18-1に、このようなマッピングの1つとして、XML文字列型のSQLのVARCHAR2
またはCLOB
へのマッピングを示します。
図18-1 simpleTypeのマッピング: XML文字列からSQLのVARCHAR2またはCLOB
表18-4から表18-7までに、XML Schema定義に指定された、SQLへのXML Schema simpleType
のデフォルトのマッピングを示します。
次に例を示します。
XML Schemaの基本型は最も近いSQLデータ型にマップされます。たとえば、DECIMAL
、POSITIVEINTEGER
および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データ型 |
---|---|---|---|
|
n |
|
|
|
- |
|
|
表18-5 XML Schemaバイナリ・データ型(hexBinary/base64Binary)のSQLへのマッピング
XML Schemaバイナリ型 | lengthまたはmaxLengthファセット | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|---|
|
n |
|
|
|
- |
|
|
表18-6 SQLへのXML Schema数値基本型のデフォルトのマッピング
XML Schema simpleType | デフォルトSQLデータ型 | 指定されたtotalDigits (m)、fractionDigits(n) | 互換性のあるSQLデータ型 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表18-7 XML Schema日時データ型のSQLへのマッピング
XML Schema日時型 | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
表18-8 SQLへのその他のXML Schema基本および派生データ型のデフォルトのマッピング
XML Schema基本および派生型 | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
|
|
なし |
|
|
なし |
Oracle XML DBでは、NCHAR
、NVARCHAR2
およびNCLOB
は、属性SQLType
の値としてサポートされません。XML要素または属性の型にNCHAR
、NVARCHAR2
またはNCLOB
を指定できません。また、ユーザー独自のデータ型を提供する場合は、これらのデータ型を使用しないでください。
関連項目:
XML Schemaで、データ型が、maxLength
が4000未満の文字列として指定されている場合、このデータ型は、指定された長さのVARCHAR2
オブジェクト属性にマップされます。スキーマにmaxLength
が指定されていない場合、XML Schemaデータ型はLOBのみにマップできます。
これは、ほとんどの文字列の値が小さく、LOBを必要とする値がわずかである場合は、あまり効率的ではありません。
関連項目:
アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、属性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:dateTime
とxsd:time
はSQLデータ型TIMESTAMP
にマップされ、他のすべての日付型はSQLデータ型DATE
にマップされます。
SQLデータ型TIMESTAMP
とDATE
には、タイムゾーン・インジケータを使用できません。このため、アプリケーションでタイムゾーン情報が必要な場合は、属性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"/>
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
脚注 8がfalse
に設定されている場合)になります。VARRAY値のデフォルトの記憶域はOrdered Collection Table(OCT)です。非推奨の属性xdb:storeVarrayAsTable
脚注8をfalse
に設定することによって、かわりにLOB記憶域を選択できます。
グローバルな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>
XML Schemaでは、complexType
の値はcomplexContent
およびsimpleContent
に基づいて宣言されます。Oracle XML DBでは、complexType
に対する様々な拡張および制限が定義されます。
simpleContent
は、simpleType
の拡張として宣言されます。
complexContent
は、次のいずれかとして宣言されます。
ベース型
complexType
の拡張
complexType
の制限
complexType
では、Oracle XML DBが他の複合型を拡張する型と制限する型で異なるようにXML Schemaでの継承を処理します。
他の複合型を拡張するように宣言された拡張型の場合、ベース型に対応するSQL型が現在のSQL型のスーパータイプとして指定されます。サブcomplexTypeに宣言された追加属性および要素のみが、サブ・オブジェクト型に属性として追加されます。
他の複合型を制約するように宣言された拡張型の場合、サブ複合型に対するSQL型がそのベース型のSQL型と同じになるように設定されます。これは、SQLでは継承メカニズムを介したオブジェクト型の制限がサポートされないためです。すべての制約は、XML Schemaでの制限によるものです。
例18-9は、Address
というベースcomplexType
、およびUSAddress
、IntlAddress
という2つの拡張を定義するXML Schemaの登録を示しています。
注意:
対応するcomplexType
でfinal
属性が指定されるため、型intladdr_t
はfinal型として作成されます。デフォルトでは、すべての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は、ベースのcomplexType
のAddress
、および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;
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;
Oracle XML DBでは、要素の宣言であるany
および属性の宣言であるanyAttribute
は、作成されたオブジェクト型のVARCHAR2
属性(またはオプションでラージ・オブジェクト(LOB))にマップされます。オブジェクト属性によって、any
宣言に一致するXMLフラグメントのテキストが格納されます。
コンテンツが指定された名前空間に属するように、namespace
属性を使用してコンテンツを制限できます。
any
要素宣言内のprocessContents
属性は、any
宣言に一致するコンテンツに必要な検証レベルを示します。
例18-12のコードでは、オブジェクト型obj_t
で、any
要素が宣言されて列SYS_XDBANY$
にマップされます。また、属性processContents
がany
宣言に一致するコンテンツを検証しないことも宣言されます。
例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;
XML SchemaがOracle XML DBに登録された後は、XMLType
表または列を定義するときにそれを参照できます。
XML Schemaに基づくデータを格納するXMLType
表または列を作成する際に、記憶域モデルを指定しない場合、使用される記憶域モデルは、参照するXML Schemaの登録時に指定した記憶域モデルです。XML Schemaの登録時に記憶域モデルを指定しなかった場合は、オブジェクト・リレーショナル形式の記憶域が使用されます。
例18-13に、PurchaseOrder
要素のデフォルト表である表purchaseorder
を手動で作成する方法を示します。
例18-13
のCREATE TABLE文は、XML Schema登録の際、パラメータGENTABLES
をTRUE
に設定すると、Oracle XML DBにより自動生成されるCREATE TABLE
文と同等です。
例18-13で使用されているXML Schemaでは、表purchaseOrder
がPurchaseOrder
要素のデフォルト表であることが指定されています。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-13のCREATE TABLE
文は、単一レベルのネストが行われている発注書に対応しています。LineItem
要素のコレクションを管理するVARRAYは、Ordered Collection Table、lineitem_table
です。
ここで、別のXML Schemaを想定し、Shipment
要素のコレクションがShipments
要素内にあり、この要素がLineItem
要素内にあるとします。この場合は、例18-14に示すように、表を手動で作成できます。
例18-15に示すように、SQL*PlusのDESCRIBE
文を使用すると、XMLType
表に関する情報を表示できます。
例18-15のDESCRIBE
文の出力には、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"
オブジェクト・リレーショナル形式の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つ作成できません。
キーワードGLOBAL
をCREATE 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言語リファレンス』を参照してください。
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のエクステントを割り当てることを指定しています。
関連項目:
オブジェクト・リレーショナル形式のデータのパーティション化の詳細は、『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)));
子表のパーティションの定義やメンテナンスは、手動で行う必要はありません。実表(親表)に対してパーティション・メンテナンスを実行すると、対応するメンテナンスが子表に対しても自動的に実行されます。
ただし、実表に対してのみパーティション・メンテナンスを実行するというのは一般的なルールで、例外もあります。次のような場合は、子表に対してメンテナンスを実行します。
コレクション・パーティションのデフォルトの物理記憶域属性を変更する場合
コレクション・パーティションの物理記憶域属性を変更する場合
コレクション・パーティションを別のセグメント(または別の表領域のセグメント)に移動する場合
コレクション・パーティションの名前を変更する場合
たとえば、実表の表領域を変更した場合、その変更はその子表パーティションにカスケード処理されません。子表の表領域を変更するには、子表パーティションに対して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パッケージおよびタイプ・リファレンス』を参照してください。
XMLType
データがオブジェクト・リレーショナル形式で格納されている場合は、XML文書内で1回のみ出現する要素および属性に対して、標準的なリレーショナル制約を指定できます。
例18-18では、標準データベース・スキーマOE
にあるXMLType
表purchaseorder
に、一意性制約と外部キー制約を定義しています。
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
に違反します。
関連項目:
「SQL制約を使用した参照整合性の規定」、特に例3-8を参照してください。
バイナリXMLとして格納されるXMLType
データに対する制約の定義の詳細は、「データベースを使用したXMLデータ整合性の規定」を参照してください。
例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
複数回出現する要素に制約を作成するには、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
デフォルトでは、XMLType
データがオブジェクト・リレーショナル形式で格納される場合、子要素は埋込みSQLオブジェクト属性にマップされます。ときには、XMLType
データの一部を表外に格納することによってパフォーマンスが向上する場合があります。XML Schema注釈xdb:SQLInline
を使用してこれを実行します。
XMLフラグメントを表外に格納するには、XML Schema注釈xdb:SQLInline
をfalse
に設定します。この要素は、表外に格納されるXMLフラグメントに対応するXMLType
の他のインスタンスを指す、埋込みREF
属性を持つSQLオブジェクト型にマップされます。
デフォルトでは、XMLType
データがオブジェクト・リレーショナル形式で格納される場合、子XML要素は埋込みSQLオブジェクト属性にマップされます。ただし、表外に格納することによってパフォーマンスが向上する場合もあります。そのような場合は、XML Schema注釈(属性)xdb:SQLInline
をfalse
に設定すると、REF
属性が埋め込まれたSQLオブジェクト型がOracle XML DBによって生成されます。REF
は、表外に格納されるXMLフラグメントに対応するXMLType
の他のインスタンスを指します。また、デフォルトのXMLType
表が作成され、この表に表外のフラグメントが格納されます。
図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_t1
のXMLType
インスタンスを指します。表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
表外にコレクション項目を格納できます。親要素には、単一の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_reflist
とemp_tab
の間の結合を示しています。
パフォーマンスを向上するには、REF
値の索引を中間表emp_tab_reflist
に作成します。これによって、Oracle XML DBは、住所表を問い合せて、関連する行へのオブジェクト参照(REF
)を取得し、そのオブジェクト参照をREF
値のリストが格納されている中間表に結合し、従業員表を使用してその中間表を逆方向に結合することができます。
REF
に範囲指定または参照制約がある場合にのみ、REF
値に索引を作成できます。範囲指定されたREF
列には、特定の表内のオブジェクトへのポインタのみが格納されます。表emp_tab_reflist
のREF
値は、表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 |
XML Schemaは複雑になることがあります。複雑なスキーマの例として、再帰的なスキーマや循環参照を含むスキーマなどがあります。複雑または大規模な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
の実体として定義されます。
Oracle XML DBでは、循環スキーマ依存を含むXML Schemaをサポートしています。循環を検出して使用不可にし、XML Schema登録時に作成された別々のXMLType
表に再帰的要素を行として格納することで、このサポートを実現しています。
したがって、この種の構造を定義するXML Schemaを登録する場合は、パラメータgenTables
がTRUE
に設定されていることが重要です。再帰的要素の格納に使用する表の名前は、XML Schemaにxdb:defaultTable
注釈を追加することで指定できます。
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-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では、オブジェクト属性section
はXMLType
インスタンスへのREF
参照のVARRAYとして宣言されます。埋込みセクションが複数存在する可能性があるので、属性はVARRAYになります。これはSQLオブジェクトの循環が構成されないようにするためにも、属性はXMLType
インスタンスのREF
参照のVARRAYになります。
図18-4に、スキーマでのcomplexType
の自己参照の方法を示します。
関連項目:
例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;
XML Schemaどうしを、通常の方法で逐次的に登録できないように、相互に依存させることができます。
これを図18-5に示します。
図の上半分は、3つのXML Schema間の間接循環参照の例を示しています。
図の下半分は、2つの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.registerSchema
でFORCE
パラメータを使用する必要があります。
xm40.xsd
を、FORCE
モードをTRUE
に設定して登録します。
DBMS_XMLSCHEMA.registerSchema("xm40.xsd", "<schema ...", ..., FORCE => TRUE)
この時点では、xm40.xsd
を使用できません。
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";
表外の表の再帰構造に対する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>
同じ修飾名(名前空間およびローカル名)と同じ型の表外の要素は、同じデフォルト表に格納されます。特殊な場合として、循環型要素構造のルート要素を、サブ要素と同じ表の表外に格納できます。
デフォルト表を共有する両方の要素は表外の要素である必要があります。つまり、表外の要素のデフォルト表は最上位要素の表と同じにできません。同じにするには、両方の要素に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>
//
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
がその他とともに表外に格納されていない場合、問合せをリライトできます。
DBMS_XMLSCHEMA.registerSchema
を呼び出す際、OPTIONSパラメータを指定することで、DOCID
列の作成を無効化できます。これにより、スキーマ登録時に生成されるすべてのXMLType
表でDOCID
の作成が無効化されます。
OPTIONS
は、データ型PLS_INTEGER
の入力パラメータです。デフォルト値は0
で、この場合オプションは使用されません。列DOCID
の生成を継承するには、パラメータOPTIONS
をDBMS_XMLSCHEMA.REGISTER_NODOCID
(つまり1
)に設定してください。
関連項目:
『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』
複合要素をCLOBまたはBLOBとして使用できるように、SQLデータ型を指定できます。
たとえば、図18-6では、XMLフラグメント全体がLOB属性に格納されます。
例18-38では、注釈SQLType = "CLOB"
を使用して、XML Schemaで要素Addr
を定義しています。
例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);
大規模または複雑な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は、XMLType
のREF
を使用して2つの表の間の関係を保持します。この手法の適切な候補は、次のいずれかを実行するXML Schemaです。
含まれる各要素がcomplexType
として定義される選択を定義
多数の要素および属性の定義を含むcomplexType
に基づいて要素を定義
ボトムアップ方法では、下位レベルの一部のcomplexType
要素をオブジェクトとしてではなくCLOB
値として格納することによって、SQLオブジェクト型の属性の数を減らします。これを行うには、complexType
に注釈を付けるか、SQLType = "CLOB"
を指定したcomplexType
を使用します。
いずれの方法を使用するかは、アプリケーション、およびデータに対して実行される問合せと更新のタイプによって決まります。
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
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-size
をxdbcore-xobmem-bound
(50MB)の半分の値に設定します。続いて文書をロードしてみます。
メモリーが不足したらxdbcore-xobmem-bound
の値を減らし、xdbcore-loadableunot-size
をその値の半分に設定します。このようにして、文書が正常にロードされるまで続けます。
ロード操作に成功したら、パフォーマンスをよくするためにxdbcore-loadableunit-size
を上げます。xdbcore-loadableunit-size
がxdbcore-xobmem-bound
と等しい場合は、さらにパフォーマンスを向上させるために両方のパラメータ値を大きくします。
オブジェクト・リレーショナル形式で格納される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:maintainOrder
はtrue
です。
XML Schema注釈xdb:storeVarrayAsTable
は、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。
XML Schema注釈xdb:maintainOrder
およびxdb:storeVarrayAsTable
は、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。
XML Schema注釈xdb:storeVarrayAsTable
は、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。
XML Schema注釈xdb:storeVarrayAsTable
は、Oracle Database 12cリリース1 (12.1.0.1)から非推奨になりました。
この値(32767)は、初期化パラメータMAX_STRING_SIZE
がEXTENDED
であることを前提としています。『Oracle Database SQL言語リファレンス』を参照してください。