18 XML Schemaの格納と問合せ: オブジェクト・リレーショナル記憶域
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の拡張を参照してください。
-
XML Schema Part 0: Primer Second Edition - XML Schemaの概要
- XML文書のオブジェクト・リレーショナル記憶域
XML文書のオブジェクト・リレーショナル記憶域には、文書のコンテンツが一連のSQLオブジェクトに分解されて格納されます。これらのSQLオブジェクトは、SQL 1999タイプのフレームワークに基づいています。XML SchemaがOracle XML DBに登録されると、必要なSQL型定義がXML Schemaから自動的に生成されます。 - OracleでのXML Schemaの注釈
XML Schemaに注釈を付けることによって、XML Schema登録処理によって生成されるオブジェクトおよび表に影響を与えることができます。これを行うには、Oracle特有の属性を、XML Schemaによって宣言されるcomplexType、elementおよびattributeの定義に追加します。 - DBMS_XMLSCHEMAを使用したXML Schemaデータ型のSQLデータ型へのマッピング
PL/SQLパッケージDBMS_XMLSCHEMAを使用して、XML Schema属性および要素のデータ型をSQLデータ型にマップします。 - Oracle XML DBでのcomplexTypeの拡張および制限
XML Schemaでは、complexTypeの値はcomplexContentおよびsimpleContentに基づいて宣言されます。Oracle XML DBでは、complexTypeに対する様々な拡張および制限が定義されます。 - XML Schemaに基づくXMLType列および表の作成
XML SchemaがOracle XML DBに登録された後は、XMLType表または列を定義するときにそれを参照できます。 - オブジェクト・リレーショナル形式で格納されたXMLTypeの表および列のパーティション化の概要
オブジェクト・リレーショナル形式のXMLType表またはオブジェクト・リレーショナル形式で格納されているXMLType列を含む表をパーティション化したり、リスト、レンジまたはハッシュのパーティション化を使用すると、デフォルトでデータ内のOrdered Collection Table (OCT)や表外の表もそれに応じて自動的にパーティション化されます。 - XMLType表および列に対するリレーショナル制約の指定
XMLTypeデータがオブジェクト・リレーショナル形式で格納されている場合は、XML文書内で1回のみ出現する要素および属性に対して、標準的なリレーショナル制約を指定できます。 - XMLTypeデータの表外記憶域
デフォルトでは、XMLTypeデータがオブジェクト・リレーショナル形式で格納される場合、子要素は埋込みSQLオブジェクト属性にマップされます。ときには、XMLTypeデータの一部を表外に格納することによってパフォーマンスが向上する場合があります。XML Schema注釈xdb:SQLInlineを使用してこれを実行します。 - 複雑または大規模なXML Schemaの操作の考慮事項
XML Schemaは複雑になることがあります。複雑なスキーマの例として、再帰的なスキーマや循環参照を含むスキーマなどがあります。複雑または大規模なXML Schemaの操作は困難で、いくつかの点を考慮する必要があります。 - オブジェクト・リレーショナル形式で格納されたXMLデータのためのXML Schema登録のデバッグ
オブジェクト・リレーショナル形式で格納されるXMLデータの場合、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaを起動する前にイベント31098を設定することで、XML Schema登録中に作成されるオブジェクト型および表を監視できます。
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コンテンツの問合せおよび更新に必要なメモリーの量も削減できます。
- オブジェクト・リレーショナル形式のXMLType記憶域の場合のコレクション格納方法
Ordered Collectionは、ヒープに基づく表(推奨)と索引構成表(IOT)のいずれかにすることができるOrdered Collection Table (OCT)のVARRAYとして格納できます。データに対するREFであるVARRAYエントリを使用して、実際のデータを表外に格納できます。 - オブジェクト・リレーショナル記憶域に対してXML Schema登録時に作成されるSQL型
オブジェクト・リレーショナル形式で格納されているXMLデータで使用するためにXML Schemaを登録する際は、パラメータGENTYPESの値にTRUEを使用します(TRUEがデフォルト値)。これにより、Oracle XML DBでは、準拠するXML文書のオブジェクト・リレーショナル記憶域に対応した適切なSQLオブジェクト型が作成されます。 - XML Schemaの登録時に作成されるデフォルト表
デフォルト表は、XML Schema登録の一部として作成できます。デフォルト表は、FTPやHTTP(S)など、表が指定されないAPIおよびプロトコルを介して文書が挿入される場合に非常に役立ちます。 - XML Schemaの登録時に生成された内部構造体を使用しない
一般的に、XML Schemaの登録中に自動的に生成されたSQL構造体(データ型、ネストされた表、および表外の記憶域に関連付けられている表)は、Oracle XML DB内部にあります。これらをコードで使用しないことをお薦めします。 - 大/小文字が区別される生成名
XML Schemaの登録で生成されたSQL表、オブジェクト、属性の名前は、大/小文字が区別されます。 - SYS_XDBPD$とオブジェクト・リレーショナル記憶域のDOM再現性
オブジェクト・リレーショナル形式で格納されているXMLデータのDOM再現性を示すために、Oracle XML DBは、システム定義のバイナリ・オブジェクト属性SYS_XDBPD$(位置指定ディスクリプタ(PD))を使用して、他のオブジェクト属性に格納できないすべての情報をインスタンス・レベルのメタデータとして記録します。
18.1.1 オブジェクト・リレーショナル形式のXMLType記憶域の場合のコレクション格納方法
Ordered Collectionは、ヒープに基づく表(推奨)と索引構成表(IOT)のいずれかにすることができるOrdered Collection Table (OCT)のVARRAYとして格納できます。データに対するREFであるVARRAYエントリを使用して、実際のデータを表外に格納できます。
オブジェクト・リレーショナル形式で格納されるXMLTypeデータのXML Schemaを登録し、登録パラメータGENTABLESをTRUEに設定する場合、関連付けられたXMLインスタンス・ドキュメントを格納するためにデフォルト表が自動的に作成されます。
格納されるときに、XMLコレクション要素の順序は維持されます。結果は、順序付けされたコレクションです。次の方法で順序付けされたコレクションにデータを格納できます。
-
表内のVARRAY。コレクション内の各要素は、SQLオブジェクトにマップされます。SQLオブジェクトのコレクションは、Ordered Collection Table (OCT)と呼ばれる表に、一連の行として格納されます。すべてのコレクションがOCTに格納されます。
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からIOTの使用を明示的に指示された場合を除き、IOTでなく、ヒープに基づくOCTを使用してください。IOTの記憶域には、次のような大きな制限があります。
-
コレクション表(IOT)のパーティショニングが無効化されます。
-
文書レベルのOracle Text索引しかサポートされません。要素に固有の索引や属性に固有の索引は無効になります。
関連項目:
オブジェクト・リレーショナル記憶域を使用してXMLType表および列を手動で作成する場合のコレクション記憶域の詳細は、XML文書のオブジェクト・リレーショナル記憶域を参照してください。
親トピック: 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の注釈を参照してください)。
注意:
Oracle Database 12cリリース2 (12.2.0.1)以降では、アプリケーション共通ユーザー用にオブジェクト・リレーショナル記憶域のXML Schemaを登録した場合は、xdb:SQLTypeを使用してXML Schemaの各複合型に注釈を付けて、SQLデータ型に名前を付ける必要があります。そうでない場合は、エラーが発生します。
例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文書のオブジェクト・リレーショナル記憶域
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"
親トピック: XML文書のオブジェクト・リレーショナル記憶域
18.1.4 XML Schemaの登録時に生成された内部構造体を使用しない
一般的に、XML Schemaの登録中に自動的に生成されたSQL構造体(データ型、ネストされた表、および表外の記憶域に関連付けられている表)は、Oracle XML DB内部にあります。これらをコードで使用しないことをお薦めします。
より正確には、生成されたSQLデータ型、ネストされた表、および表外の記憶域に関連付けられている表は、Oracleによっていつでも変更および再定義される、特定の内部のXML Schemaとオブジェクト型のマッピングに基づいています。一般的には、次のとおりです。
-
生成されたSQLデータ型は使用しないでください。
-
生成されたネストされた表または表外へのアクセスまたは変更は行わないでください。
ただし、生成された表のパーティション化などの記憶域オプションは変更できます。また、生成された表に対して索引または制約を作成することはできます。また、生成された構造体に名前を付ける注釈など、Oracle XML DBに付属するXML Schema注釈は自由に使用できます。
親トピック: XML文書のオブジェクト・リレーショナル記憶域
18.1.5 大/小文字が区別される生成名
XML Schemaの登録で生成されたSQL表、オブジェクト、属性の名前は、大/小文字が区別されます。
たとえば例18-2で、表PurchaseOrder1669_TABの名前は要素PurchaseOrderの名前から導出されているため、これも大/小文字が混在しています。このため、この表を参照する際に識別子に引用符を使用("PurchaseOrder1669_TAB")する必要があります。使用しないと、ORA-00942: 表またはビューが存在しませんなどの、オブジェクトが見つからないというエラーが発生します。
親トピック: XML文書のオブジェクト・リレーショナル記憶域
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列が存在しない場合、コメント、処理命令などの情報が失われる可能性があるためです。
関連項目:
DOM再現性と、XMLデータのバイナリXML記憶域の詳細は、DOM再現性を参照してください。
親トピック: XML文書のオブジェクト・リレーショナル記憶域
18.2 OracleでのXML Schemaの注釈
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スキーマ注釈の一般的な使用
XML Schemaに注釈を付けてオブジェクト・リレーショナル表、オブジェクトおよびオブジェクト属性に名前を付けたり、XPath式の引数が再帰的なXMLデータをターゲットとしているときのXPathリライトを許可したりできます。 - XML Schema注釈の例
XML Schemaの例に、最も重要なOracle XML DB注釈の一部を示します。 - DBMS_XMLSCHEMA_ANNOTATEを使用したXML Schemaの注釈付け
PL/SQLパッケージDBMS_XMLSCHEMA_ANNOTATEはXML Schemaに注釈を付けるサブプログラムを備えています。これらのサブプログラムは通常、XML Schemaを手動で編集するよりも便利でエラーが発生しにくくなります。 - 使用できるOracle XML DBのXML Schema注釈
要素と属性の宣言に指定できるOracle XML DB注釈を、その操作に使用可能な、パッケージDBMS_XMLSCHEMA_ANNOTATEのPL/SQLサブプログラムとともに説明します。 - オブジェクト・リレーショナル記憶域に対するXML Schema注釈のガイドライン
オブジェクト・リレーショナル形式で格納されるXMLTypeデータでは、パフォーマンスを最適化するために注意深い計画が求められます。エンティティ関連モデル、索引付け、データ型、表パーティションなどのリレーショナル・データについても、同様の点を考慮することが求められます。XPathリライトを有効にし、最適なパフォーマンスを達成するには、XML Schema注釈を使用してこのような多くの設計選択を実装します。 - 登録されたXML Schemaの問合せによる注釈の取得
データベース・ビューUSER_XML_SCHEMASおよびALL_XML_SCHEMASを問い合せると、登録されたXML Schemaとそれに附随するすべての注釈を取得できます。登録済のXML Schemaのバージョンには、Oracle XML DB注釈の完全なセットが含まれています。これらの注釈は、ユーザーが指定するか、XML Schemaの登録時にデフォルトで設定されます。
18.2.1 XMLスキーマ注釈の一般的な使用
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注釈の値としては使用できません。注意:
Oracle Database 12cリリース2 (12.2.0.1)以降では、アプリケーション共通ユーザー用にオブジェクト・リレーショナル記憶域のXML Schemaを登録した場合は、
xdb:SQLTypeを使用してXML Schemaの各複合型に注釈を付けて、SQLデータ型に名前を付ける必要があります。そうでない場合は、エラーが発生します。 -
xdb:SQLCollType- 要素のコレクションを管理するVARRAY型を指定するために使用します。 -
xdb:maintainDOM- 指定されているcomplexType定義のDOM再現性を維持する必要があるかどうかを判断するために使用します。
これらの属性のいずれにも、値を指定する必要はありません。Oracle XML DBにより、デフォルトで、XML Schemaの登録プロセス中に適切な値が提供されます。ただし、オブジェクト・リレーショナル記憶域を使用する場合、少なくとも最上位のSQL型の名前を指定し、後で参照できるようにすることをお薦めします。
親トピック: OracleでのXML Schemaの注釈
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_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.
親トピック: OracleでのXML Schemaの注釈
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; /
親トピック: OracleでのXML Schemaの注釈
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: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:maintainDOM PL/SQL: enableMaintainDOM disableMaintainDOM |
|
|
|
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:SQLType PL/SQL: setSQLType removeSQLType |
任意のSQLデータ型脚注 1( |
要素名から生成された名前 |
このXML要素の宣言に対応するSQL型の名前。 |
xdb:tableProps PL/SQL: setTableProps removeTableProps |
任意の表STORAGE句 |
|
デフォルトの |
脚注1
DBMS_XMLSCHEMAを使用したXML Schemaデータ型のSQLデータ型へのマッピングを参照してください。
関連項目:
オブジェクト・リレーショナル記憶域のXMLType表を手動で作成する場合の記憶域オプションの指定の詳細は、XML Schemaに基づくデータのオブジェクト・リレーショナル記憶域を参照してください。
表18-2 グローバルなcomplexType要素を宣言する要素内の注釈
| 属性 | 値 | デフォルト値 | 説明 |
|---|---|---|---|
xdb:maintainDOM PL/SQL: enableMaintainDom disableMaintainDom |
|
|
|
xdb:SQLType PL/SQL: setSQLType removeSQLType |
任意のSQLデータ型脚注 2( |
要素名から生成された名前 |
このXML要素の宣言に対応するSQL型の名前。 |
脚注2
親トピック: OracleでのXML Schemaの注釈
18.2.5 オブジェクト・リレーショナル記憶域に対するXML Schema注釈のガイドライン
オブジェクト・リレーショナル形式で格納されるXMLTypeデータでは、パフォーマンスを最適化するために注意深い計画が求められます。エンティティ関連モデル、索引付け、データ型、表パーティションなどのリレーショナル・データについても、同様の点を考慮することが求められます。XPathリライトを有効にし、最適なパフォーマンスを達成するには、XML Schema注釈を使用してこのような多くの設計選択を実装します。
- 未使用の最上位要素に不要な表作成の回避
対応するXMLインスタンスの最上位でXML Schemaの最上位の要素が使用されない場合は、注釈xdb:defaultTable =""をXML Schemaの要素に追加することで、関連する表を作成せずに済みます。この属性の空の値により、デフォルト表の作成を回避できます。 - デフォルト表に対する独自の名前の提供
チューニング用に、問合せの実行計画の出力を検証します。これは、オブジェクト・リレーショナル形式で格納されているXMLTypeデータの基礎となる表を参照します。これらの表には、システム生成された名前がデフォルトで含まれます。対象とする表の場合は特に、かわりに独自の表名を指定することをお薦めします。 - 不要な場合のDOM再現性の無効化
デフォルトでは、XML Schemaの登録で、DOM再現性を維持する表が生成されます。多くの場合、これはデータ中心のXMLデータのDOM再現性が必要でない場合です。かわりに、DOM再現性を維持しないオブジェクト・リレーショナル表を使用することで、格納、問合せおよびデータ変更のパフォーマンスを改善できます。 - タイムスタンプ・データ型を使用した時間関連要素の注釈
アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、xs:time型およびxs:dateTime型のXML Schema要素に、xdb:SQLType = "TIMESTAMP WITH TIME ZONE"の注釈を指定します。これによって、タイムゾーン・インジケータが含まれている値の格納、取出しおよび比較を実行できます。 - 表および列のプロパティの追加
オブジェクト・リレーショナルXMLTypeデータの基礎となる表または列に、パーティションや表領域、圧縮などの追加のプロパティを指定する必要がある場合は、注釈xdb:tablePropsまたはxdb:columnPropsを使用します。これを行うことにより、主キーや制約などを追加できます。 - 大規模コレクションの表外格納
大規模コレクションがある場合は、注釈xdb:defaultTableおよびxdb:SQLInlineを使用して、そのコレクション要素を表外に格納するように指定する必要がある場合があります。
関連トピック
関連項目:
親トピック: Oracleでの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"を使用します。
関連トピック
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表および列を手動で作成する際の高度な行圧縮の指定の例は、例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.- あるXML Schemaから別のXML Schemaに適用可能な注釈
あるXML Schemaから別のXML Schemaに注釈を適用する必要が生じることがあります。たとえば、古いバージョンのスキーマから新しいバージョンに注釈を適用する場合などが一般的です。PL/SQLサブプログラムgetSchemaAnnotationsを使用して注釈を取得し、setSchemaAnnotationsを使用して注釈を設定できます。
親トピック: OracleでのXML Schemaの注釈
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」を参照してください。
親トピック: 登録されたXML Schemaの問合せによる注釈の取得
18.3 DBMS_XMLSCHEMAを使用したXML Schemaデータ型のSQLデータ型へのマッピング
PL/SQLパッケージDBMS_XMLSCHEMAを使用して、XML Schema属性および要素のデータ型をSQLデータ型にマップします。
注意:
XML Schema登録時に、XML Schemaデータ型からマップされるSQLデータ型に直接アクセスしないでください。これらのSQL型はOracle XML DBの実装の一部です。ユーザーが使用できるように公開されたものではありません。オラクル社は製品パッチなどで、実装をいつでも変更する権利を留保します。オラクル社によるそうした変更は、XMLの抽象的概念に従うアプリケーションには影響しませんが、それらのデータ型に直接アクセスするアプリケーションには影響を与えることがあります。
- XML Schemaデータ型のSQLへのマッピングの例
XML Schemaデータ型のSQLデータ型へのマッピングの例を示します。 - XML Schema属性データ型のSQLへのマッピング
XML属性の宣言で、基本型、ローカルなsimpleType、グローバルなsimpleType、またはグローバル属性に対する参照(ref="..")によって、そのXML Schemaデータ型を指定できます。SQLデータ型とその関連する情報は、基本XML Schema型から導出されます。 - XML Schema要素データ型のSQLへのマッピング
XML要素の宣言で、基本型、ローカルまたはグローバルなsimpleType、ローカルまたはグローバルなcomplexType、またはグローバル要素に対する参照(ref="..")を使用して、そのXML Schemaデータ型を指定できます。SQLデータ型とその関連する情報は、基本XML Schema型から導出されます。 - XML Schema simpleTypeのSQLへのマッピング
XMLsimpleTypeは、simpleTypeが定義された方法に応じて、様々な方法でSQLオブジェクト型にマップされます。 - XML Schema complexTypeのSQLへのマッピング
XMLcomplexTypeは、complexTypeが定義された方法に応じて、様々な方法でSQLオブジェクト型にマップされます。
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から導出されます。
- 属性を宣言する際に実行できるXML Schema内のSQLType値のオーバーライド
XML Schemaに注釈としてSQLTypeの値を明示的に指定できます。指定するSQLデータ型はXML Schemaの検証で使用されて、デフォルトのSQLデータ型がオーバーライドされます。
18.3.2.1 属性を宣言する際に実行できるXML Schema内のSQLType値のオーバーライド
XML Schemaに注釈としてSQLTypeの値を明示的に指定できます。指定するSQLデータ型はXML Schemaの検証で使用されて、デフォルトのSQLデータ型がオーバーライドされます。
このようなSQLデータ型の次の特定の形式のオーバーライドのみが可能です。
-
デフォルトのSQLデータ型が
STRINGの場合、CHAR、VARCHARまたはCLOBでオーバーライドできます。 -
デフォルトのSQLデータ型が
RAWの場合は、RAWまたはBLOBでオーバーライドできます。
親トピック: XML Schema属性データ型のSQLへのマッピング
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。
- 要素を宣言する際のXML Schema内のSQLType値のオーバーライド
デフォルトでは、complexTypeに基づく要素は、各サブ要素および属性に対応するオブジェクト属性が含まれるSQLオブジェクト型にマップされます。入力XML SchemaにSQLType属性を明示的に指定することによって、このマッピングをオーバーライドできます。
18.3.3.1 要素を宣言する際のXML Schema内のSQLType値のオーバーライド
デフォルトでは、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マッピングはREFXMLTYPEに設定されます。 -
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 Schema要素データ型のSQLへのマッピング
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 simpleTypeのマッピング: XML文字列からSQLのVARCHAR2またはCLOB」の説明
表18-3から表18-6までに、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-3 XML Schema文字列データ型のSQLへのマッピング
| XML Schema文字列型 | lengthまたはmaxLengthファセット | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
|---|---|---|---|
|
|
n |
|
|
|
|
- |
|
|
表18-4 XML Schemaバイナリ・データ型(hexBinary/base64Binary)のSQLへのマッピング
| XML Schemaバイナリ型 | lengthまたはmaxLengthファセット | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
|---|---|---|---|
|
|
n |
|
|
|
|
- |
|
|
表18-5 SQLへのXML Schema数値基本型のデフォルトのマッピング
| XML Schema simpleType | デフォルトSQLデータ型 | 指定されたtotalDigits (m)、fractionDigits(n) | 互換性のあるSQLデータ型 |
|---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表18-6 XML Schema日時データ型のSQLへのマッピング
| XML Schema日時型 | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
表18-7 SQLへのその他のXML Schema基本および派生データ型のデフォルトのマッピング
| XML Schema基本および派生型 | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
|
|
|
なし |
|
|
|
なし |
- SQLTypeでサポートされないNCHAR、NVARCHAR2およびNCLOBのSQLType値
Oracle XML DBでは、NCHAR、NVARCHAR2およびNCLOBは、属性SQLTypeの値としてサポートされません。XML要素または属性の型にNCHAR、NVARCHAR2またはNCLOBを指定できません。また、ユーザー独自のデータ型を提供する場合は、これらのデータ型を使用しないでください。 - simpleType: SQLのVARCHAR2またはCLOBへのXML文字列のマッピング方法
XML Schemaで、データ型が、maxLengthが4000未満の文字列として指定されている場合、このデータ型は、指定された長さのVARCHAR2オブジェクト属性にマップされます。スキーマにmaxLengthが指定されていない場合、XML Schemaデータ型はLOBのみにマップできます。 - XML SchemaのタイムゾーンのSQLへのマッピング方法
アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、属性SQLTypeを使用して、SQL型をTIMESTAMP WITH TIME ZONEに指定してください。これによって、タイムゾーン・インジケータが含まれている値の適切な格納および取出しを実行できます。
18.3.4.1 SQLTypeでサポートされないNCHAR、NVARCHAR2およびNCLOBのSQLType値
Oracle XML DBでは、NCHAR、NVARCHAR2およびNCLOBは、属性SQLTypeの値としてサポートされません。XML要素または属性の型にNCHAR、NVARCHAR2またはNCLOBを指定できません。また、ユーザー独自のデータ型を提供する場合は、これらのデータ型を使用しないでください。
関連トピック
18.3.4.2 simpleType: SQLのVARCHAR2またはCLOBへのXML文字列のマッピング方法
XML Schemaで、データ型が、maxLengthが4000未満の文字列として指定されている場合、このデータ型は、指定された長さのVARCHAR2オブジェクト属性にマップされます。スキーマにmaxLengthが指定されていない場合、XML Schemaデータ型はLOBのみにマップできます。
これは、ほとんどの文字列の値が小さく、LOBを必要とする値がわずかである場合は、あまり効率的ではありません。
関連項目:
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: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"/>- 値の最後にZを使用したUTCタイムゾーンの指定
UTCタイムゾーンを表すために、XML Schemaのタイムゾーン・コンポーネントにZを指定できます。最後にZが付く値をSQLTIMESTAMP WITH TIME ZONEとして格納すると、そのタイムゾーンは実質的に+00:00として格納されます。取得したタイムゾーン値の最後には、元のZではなく、+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 (オブジェクト)属性にマップされます。コレクションは、Ordered Collection Table (OCT)であるVARRAY値です。
- complexType XML Schema宣言での属性の指定
グローバルなcomplexTypeに基づく要素がある場合は、complexType宣言に属性SQLTypeが指定されている必要があります。要素の宣言内に同じSQLType属性を含めることもできます。
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の制限
-
- XML SchemaでのcomplexTypeの宣言: 継承の処理
complexTypeでは、Oracle XML DBが他の複合型を拡張する型と制限する型で異なるようにXML Schemaでの継承を処理します。 - simpleContentに基づくcomplexTypeのオブジェクト型へのマッピング
simpleContent宣言に基づく複合型は、XML属性に対応する属性および本体の値に対応する追加のSYS_XDBBODY$属性を持つオブジェクト型にマップされます。本体属性のデータ型は、本体の型を定義するsimpleTypeに基づきます。 - anyおよびanyAttribute宣言のオブジェクト型属性へのマッピング
Oracle XML DBでは、要素の宣言であるanyおよび属性の宣言であるanyAttributeは、作成されたオブジェクト型のVARCHAR2属性(またはオプションでラージ・オブジェクト(LOB))にマップされます。オブジェクト属性によって、any宣言に一致するXMLフラグメントのテキストが格納されます。
18.4.1 XML Schemaでの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;
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宣言に一致するコンテンツに必要な検証レベルを示します。
注意:
Oracle Database 12cリリース2 (12.2.0.1)以降では、マルチテナント・コンテナ・データベース(CDB)の共通ユーザーまたはアプリケーション共通ユーザーによってオブジェクト・リレーショナルXMLType記憶域に対してXML Schemaが登録された場合は、xdb:SQLTypeを使用して複合型に注釈を付けて、対応するSQLデータ型を指定して使用する必要があります。そうでない場合は、エラーが発生します。
例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;
18.5 XML Schemaに基づくXMLType列および表の作成
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の登録により、コレクションに対してOrdered Collection Table(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"
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つ作成できません。
キーワード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'
- オブジェクト・リレーショナル形式で格納されたXMLTypeデータのパーティション化の例
XML Schemaの登録中または表の作成中に、オブジェクト・リレーショナルXMLTypeの実表のパーティション化情報を指定できます。ここでは、この例を示します。 - オブジェクト・リレーショナル形式で格納されたXMLTypeデータのパーティション・メンテナンス
子表のパーティションの定義やメンテナンスは、手動で行う必要はありません。実表(親表)に対してパーティション・メンテナンスを実行すると、対応するメンテナンスが子表に対しても自動的に実行されます。
関連項目:
キーワード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のエクステントを割り当てることを指定しています。
関連項目:
-
オブジェクト・リレーショナル形式のデータのパーティション化の詳細は、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 オブジェクト・リレーショナル形式で格納されたXMLTypeデータのパーティション・メンテナンス
子表のパーティションの定義やメンテナンスは、手動で行う必要はありません。実表(親表)に対してパーティション・メンテナンスを実行すると、対応するメンテナンスが子表に対しても自動的に実行されます。
ただし、実表に対してのみパーティション・メンテナンスを実行するというのは一般的なルールで、例外もあります。次のような場合は、子表に対してメンテナンスを実行します。
-
コレクション・パーティションのデフォルトの物理記憶域属性を変更する場合
-
コレクション・パーティションの物理記憶域属性を変更する場合
-
コレクション・パーティションを別のセグメント(または別の表領域のセグメント)に移動する場合
-
コレクション・パーティションの名前を変更する場合
たとえば、実表の表領域を変更した場合、その変更はその子表パーティションにカスケード処理されません。子表の表領域を変更するには、子表パーティションに対して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にある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.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
親トピック: XMLType表および列に対するリレーショナル制約の指定
18.8 XMLTypeデータの表外記憶域
デフォルトでは、XMLTypeデータがオブジェクト・リレーショナル形式で格納される場合、子要素は埋込みSQLオブジェクト属性にマップされます。ときには、XMLTypeデータの一部を表外に格納することによってパフォーマンスが向上する場合があります。XML Schema注釈xdb:SQLInlineを使用してこれを実行します。
- 表外に格納するための注釈属性xdb:SQLInlineのfalse設定
XMLフラグメントを表外に格納するには、XML Schema注釈xdb:SQLInlineをfalseに設定します。この要素は、表外に格納されるXMLフラグメントに対応するXMLTypeの他のインスタンスを指す、埋込みREF属性を持つSQLオブジェクト型にマップされます。 - 表外の表へのコレクションの格納
表外にコレクション項目を格納できます。親要素には、単一のREF列ではなく、コレクションのメンバーを指すREF値のVARRAYが挿入されます。
18.8.1 表外に格納するための注釈属性xdb:SQLInlineのfalse設定
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
親トピック: XMLTypeデータの表外記憶域
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が含まれます。
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 |
親トピック: XMLTypeデータの表外記憶域
18.9 複雑または大規模なXML Schemaの操作の考慮事項
XML Schemaは複雑になることがあります。複雑なスキーマの例として、再帰的なスキーマや循環参照を含むスキーマなどがあります。複雑または大規模なXML Schemaの操作は困難で、いくつかの点を考慮する必要があります。
- XML Schema間での循環依存
W3C XML Schema勧告では、complexTypesおよびグローバル要素に再帰的参照を挿入できます。この種の構造では、対象の要素が再帰的階層で無限に出現する可能性があるインスタンス・ドキュメントを使用できます。 - 再帰的スキーマのサポート
表外の表の再帰構造に対するREFにより、コンパイル時に構造の深さがわからなくなるため、XPath問合せのリライトが困難になる場合があります。XPathリライトを可能にするには、再帰構造でDOCID列がルート文書を指すようにします。 - ラージ・オブジェクト(LOB)にマップできるXMLフラグメント
複合要素をCLOBまたはBLOBとして使用できるように、SQLデータ型を指定できます。 - ORA-01792およびORA-04031: 大規模XML Schemaに関する問題
大規模または複雑なXML Schemaを操作すると、エラーORA-01792およびORA-04031が発生することがあります。これらは、XML Schemaを登録する際、またはXML Schemaによって定義されたグローバル要素に基づく表を作成する際に発生することがあります。 - コレクションでの大規模な文書のロードおよび取得の考慮事項
Oracle XML DB構成ファイルxdbconfig.xmlには、ロード操作で使用されるメモリー量を制御するパラメータ(xdbcore-loadableunit-sizeおよびxdbcore-xobmem-bound)があります。
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の実体として定義されます。
- XML Schemaの循環依存のためのパラメータGenTablesのTRUE設定
Oracle XML DBでは、循環スキーマ依存を含むXML Schemaをサポートしています。循環を検出して使用不可にし、XML Schema登録時に作成された別々のXMLType表に再帰的要素を行として格納することで、このサポートを実現しています。 - XML SchemaでのcomplexTypeの宣言: 循環の処理
SQLオブジェクト型では、循環を使用できません。オブジェクト型の生成時、循環が完了した時点でREF属性を設定することによって、XML Schemaでの循環が使用不可になります。データの一部は表外に格納されていますが、親であるXML文書の一部として取得されます。 - XML Schema間での循環参照
XML Schemaどうしを、通常の方法で逐次的に登録できないように、相互に依存させることができます。
親トピック: 複雑または大規模なXML Schemaの操作の考慮事項
18.9.1.1 XML Schemaの循環依存のためのパラメータGenTablesのTRUE設定
Oracle XML DBでは、循環スキーマ依存を含むXML Schemaをサポートしています。循環を検出して使用不可にし、XML Schema登録時に作成された別々のXMLType表に再帰的要素を行として格納することで、このサポートを実現しています。
したがって、この種の構造を定義するXML Schemaを登録する場合は、パラメータgenTablesがTRUEに設定されていることが重要です。再帰的要素の格納に使用する表の名前は、XML Schemaにxdb:defaultTable注釈を追加することで指定できます。
親トピック: XML Schema間での循環依存
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-30では、SectionT型が自己参照しています。
例18-30のXML Schemaでは、Oracle XML DBによって次の型が生成されます。
CREATE TYPE body_coll AS VARRAY(32767Foot 3) OF VARCHAR2(32767Footref 3);
CREATE TYPE section_t AS OBJECT (SYS_XDBPD$ XDB.XDB$RAW_LIST_T,
"title" VARCHAR2(32767Footref 3),
"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.9.1.3 XML Schema間での循環参照
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";
親トピック: XML Schema間での循環依存
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>
- 一般的な表外の要素間で共有されるdefaultTable
同じ修飾名(名前空間およびローカル名)と同じ型の表外の要素は、同じデフォルト表に格納されます。特殊な場合として、循環型要素構造のルート要素を、サブ要素と同じ表の表外に格納できます。 - DOCIDが存在する場合の問合せのリライト
//XPath式を処理する前に、同じ要素が複数回出現していないか確認します。//の下にあるすべての出現が同じdefaultTableを共有する場合、DOCIDを使用した表に対して問合せをリライトできます。 - DOCID列の作成の無効化
DBMS_XMLSCHEMA.registerSchemaを呼び出す際、OPTIONSパラメータを指定することで、DOCID列の作成を無効化できます。これにより、スキーマ登録時に生成されるすべてのXMLType表でDOCIDの作成が無効化されます。
親トピック: 複雑または大規模なXML 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.3 ラージ・オブジェクト(LOB)にマップできるXMLフラグメント
複合要素を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の操作の考慮事項
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は、XMLTypeのREFを使用して2つの表の間の関係を保持します。この手法の適切な候補は、次のいずれかを実行するXML Schemaです。
-
含まれる各要素がcomplexTypeとして定義される
選択を定義 -
多数の要素および属性の定義を含むcomplexTypeに基づいて要素を定義
ボトムアップ方法では、下位レベルの一部のcomplexType要素をオブジェクトとしてではなくCLOB値として格納することによって、SQLオブジェクト型の属性の数を減らします。これを行うには、complexTypeに注釈を付けるか、SQLType = "CLOB"を指定したcomplexTypeを使用します。
いずれの方法を使用するかは、アプリケーション、およびデータに対して実行される問合せと更新のタイプによって決まります。
親トピック: 複雑または大規模なXML Schemaの操作の考慮事項
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
- 構成パラメータxdbcore-loadableunit-sizeおよびxdbcore-xobmem-boundのガイドライン
PGAサイズと試行錯誤により、構成パラメータxdbcore-loadableunit-sizeおよびxdbcore-xobmem-boundの最適な値を特定します。
親トピック: 複雑または大規模なXML Schemaの操作の考慮事項
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-sizeをxdbcore-xobmem-bound(50MB)の半分の値に設定します。続いて文書をロードしてみます。
メモリーが不足したらxdbcore-xobmem-boundの値を減らし、xdbcore-loadableunot-sizeをその値の半分に設定します。このようにして、文書が正常にロードされるまで続けます。
ロード操作に成功したら、パフォーマンスをよくするためにxdbcore-loadableunit-sizeを上げます。xdbcore-loadableunit-sizeがxdbcore-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の登録中の問題を診断するために役立ちます。
脚注の説明
脚注3:この値(32767)は、初期化パラメータMAX_STRING_SIZEがEXTENDEDであることを前提としています。『Oracle Database SQL言語リファレンス』を参照してください。




