17 XML Schemaの格納と問合せ: 基本
XML Schemaとは、XML文書のコンテンツおよび構造を記述するための標準です。Oracle XML DBで使用するXML Schemaは、登録、更新および削除できます。XML Schemaに基づくデータに使用する記憶域構造を定義し、XML Schemaデータ型をSQLデータ型にマッピングできます。
XML Schema勧告はXML文書のコンテンツおよび構造を記述するためにWorld Wide Web Consortium (W3C)で作成されました。これには既存のDocument Type Definitions (DTD)をXML Schemaに変換できるように、すべてのDTDの機能が含まれています。XML schemaにはDTDにはない追加機能があります。
- XML Schemaの概要
W3CのXML Schema勧告では、一連のXML文書の構造、コンテンツおよび特定のセマンティクスを指定するための標準化された言語が定義されています。XML Schemaは、XML文書のクラスを示すメタデータとみなすことができます。 - Oracle XML DBにおけるXML Schemaの使用方法の概要
Oracle XML DBは、XML Schemaの登録、XML Schemaに対する文書の検証、SQLオブジェクト型からのXML Schemaの生成、XML SchemaからSQLへのマッピング、XML Schemaに基づく表、ビューおよび列の作成および問合せ、およびXML Schemaに基づく文書がOracle XML DBリポジトリに挿入されたときのデータの自動挿入をサポートしています。 - Oracle XML DBへのXML Schemaの登録
XML SchemaをOracle XML DBで使用するには、登録する必要があります。その後、これを使用して、XMLType
表および列を作成したり、XML文書を検証することができます。スキーマ登録が失敗した場合、データベースは登録を試行する前の状態に復元されます。 - XML Schemaに基づくXMLType表および列の作成
XML Schemaによって定義されたグローバル要素に限定したXMLType
表および列を作成できます。XMLType
列を特定の要素および特定のスキーマに限定すると、以降はその要素のスキーマ定義に準拠している文書のみを含めることができます。 - XML Schemaインスタンス・ドキュメントの識別方法
XML文書をXML Schemaに基づくXMLType
表または列に挿入する前に、関連付けられているXML Schemaを識別する必要があります。表または列の作成時にこれを実行することも、XMLSchema-instance
を使用して、必要なスキーマ識別を明示的にXMLインスタンス・ドキュメントに追加することもできます。 - XML Schemaデータ型のOracle XML DB記憶域へのマッピング
XML Schemaに準拠するデータは、XML Schemaデータ型を使用します。このXMLデータがOracle XML DBに格納される場合、その記憶域データ型はデフォルトのマッピングを使用して(およびオプションで、XML Schema注釈を使用して指定したマッピング情報を使用して)、XML Schemaデータ型から導かれます。
関連項目:
-
Oracle XML DBでのXML Schemaの使用に関する高度な情報は、XML Schemaの格納と問合せ: オブジェクト・リレーショナル記憶域を参照してください。
-
Oracle XML DBでのXPath式の最適化の詳細は、オブジェクト・リレーショナル記憶域のXPathリライトを参照してください。
-
XML Schema Part 0: Primer Second Edition - XML Schemaの概要
17.1 XML Schemaの概要
W3CのXML Schema勧告では、一連のXML文書の構造、コンテンツおよび特定のセマンティクスを指定するための標準化された言語が定義されています。XML Schemaは、XML文書のクラスを示すメタデータとみなすことができます。
このドキュメントで、XML SchemaとはXML Schemaインスタンス定義を指します。
- XML Schema for Schemas
W3CのSchemaワーキング・グループは「Schema for Schemas」と呼ばれるXML Schemaを公開しています。このXML Schemaによって、XML Schema言語の定義またはボキャブラリが提供されます。有効なすべてのXML Schemaは、そのXML Schemaで定義されたクラスのメンバーとみなすことができます。 - XML Schemaの機能
XML Schemaは、要素と属性の厳密な型指定のために、47のスカラー・データ型を定義しています。これは、オブジェクト指向の継承および拡張をサポートしているため、基本データ型から複合オブジェクトを持つXML Schemaを設計できます。これには、定義および順序付けの構造体、デフォルト値、必須コンテンツ、ネスト、セットの繰返しおよび再定義が含まれます。 - XMLインスタンス・ドキュメント
XML Schemaに準拠するドキュメントは、そのXML Schemaで定義されたクラスのインスタンスとみなすことができます。XML Schemaの一般的な用途は、指定されたそのようなインスタンス・ドキュメントがXML Schemaで定義されたルールに準拠していることを確認することです。 - XML名前空間とXML Schema
XML Schemaには、targetNamespace
属性を指定でき、その値にはURLを指定します。省略されている場合、スキーマにターゲット名前空間はありません。ターゲット名前空間は、XML Schemaで定義されているすべてのものの名前空間です。targetNamespace
値は、通常、XML SchemaにアクセスできるURLです。 - XML Schemaの編集の概要
XML Schemaは、任意の方法で作成および編集できます。
関連項目:
XML Schema Part 0: Primer - XML Schema勧告の一般的な説明
親トピック: XML Schemaの格納と問合せ: 基本
17.1.1 XML Schema for Schemas
W3CのSchemaワーキング・グループは「Schema for Schemas」と呼ばれるXML Schemaを公開しています。このXML Schemaによって、XML Schema言語の定義またはボキャブラリが提供されます。有効なすべてのXML Schemaは、そのXML Schemaで定義されたクラスのメンバーとみなすことができます。
したがって、XML Schemaは(https://www.w3.org/2001/XMLSchema
で公開されている)XML Schemaで定義されたクラスに準拠するXML文書です。
親トピック: XML Schemaの概要
17.1.2 XML Schemaの機能
XML Schemaは、要素と属性の厳密な型指定のために、47のスカラー・データ型を定義しています。これは、オブジェクト指向の継承および拡張をサポートしているため、基本データ型から複合オブジェクトを持つXML Schemaを設計できます。これには、定義および順序付けの構造体、デフォルト値、必須コンテンツ、ネスト、セットの繰返しおよび再定義が含まれます。
Oracle XML DBは、XML Schemaで定義されたすべての構造体をサポートします(redefinesを除く)。
親トピック: XML Schemaの概要
17.1.3 XMLインスタンス・ドキュメント
XML Schemaに準拠するドキュメントは、そのXML Schemaで定義されたクラスのインスタンスとみなすことができます。XML Schemaの一般的な用途は、指定されたそのようなインスタンス・ドキュメントがXML Schemaで定義されたルールに準拠していることを確認することです。
親トピック: XML Schemaの概要
17.1.4 XML名前空間とXML Schema
XML Schemaには、targetNamespace
属性を指定でき、その値にはURLを指定します。省略されている場合、スキーマにターゲット名前空間はありません。ターゲット名前空間は、XML Schemaで定義されているすべてのものの名前空間です。targetNamespace
値は、通常、XML SchemaにアクセスできるURLです。
XMLインスタンス・ドキュメントには、ドキュメントのルート要素の名前空間(インスタンスが準拠しているXML Schemaのターゲット名前空間と同一)、およびこのルート要素を定義するXML Schemaの場所(URL)が指定されている必要があります。この情報は、属性xsi:schemaLocation
で指定されます。XML Schemaにターゲットの名前空間がない場合は、xsi:noNamespaceSchemaLocation
属性を使用してXML Schema URLを指定します。
親トピック: XML Schemaの概要
17.1.5 XML Schemaの編集の概要
XML Schemaは、任意の方法で作成および編集できます。
たとえば、次のいずれかを使用できます。
-
Emacsやviなどの簡単なテキスト・エディタ
-
Oracle JDeveloperに付属のXMLエディタなど、XML Schema対応のエディタ
-
Altova社のXMLSpyなどの明示的なXML Schema作成ツール
図17-1は、発注書XML SchemaのXMLSpyでの編集を示しています。XMLSpyは、Altova社のグラフィカルなXMLツールで、XML SchemaおよびXML文書の作成と編集に使用できます。詳細は、Altova.comを参照してください。脚注1
図17-1 XML Schema Purchase-OrderのXMLSpyによるグラフィカル表現
「図17-1 XML Schema Purchase-OrderのXMLSpyによるグラフィカル表現」の説明
親トピック: XML Schemaの概要
17.2 Oracle XML DBにおけるXML Schemaの使用方法の概要
Oracle XML DBは、XML Schemaの登録、XML Schemaに対する文書の検証、SQLオブジェクト型からのXML Schemaの生成、XML SchemaからSQLへのマッピング、XML Schemaに基づく表、ビューおよび列の作成および問合せ、およびXML Schemaに基づく文書がOracle XML DBリポジトリに挿入されたときのデータの自動挿入をサポートしています。
XML Schemaは、それらを参照するXML文書と同じように、XMLType
インスタンスとしてOracle XML DBに格納されます。データベースに格納されるXMLデータとともにXML Schemaを使用するには、そのXML SchemaをOracle XML DBに登録する必要があります。
Oracle XML DBは、厳密な型指定などのXML Schemaの機能を利用して、XMLデータベース・データを安全かつ効率的に処理します。
Oracle XML DBに登録するには、XML SchemaがルートXML Schema、すなわちXDBSchema.xsdに準拠している必要があります。これは、Oracle XML DB XML SchemaのXML Schemaです。Oracle XML DBリポジトリの場所で、/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/XDBSchema.xsd
にあるXDBSchema.xsd
にアクセスできます。
Oracle XML DBはメタデータとして注釈付きXML Schemaを使用します。標準XML Schema定義は、いくつかのOracle名前空間属性で定義された属性とともに使用されます。これらの属性は、データベースへのXMLインスタンス文書のマッピング方法を決定します。これらの属性は、XML Schemaの名前空間とは異なる名前空間に存在するため、注釈付きXML SchemaはXML Schema標準に準拠します。
Oracle XML DBでは、次のタスクに対してXML Schemaのサポートが提供されます。
-
ローカルおよびグローバルな、W3C準拠のXML Schemaの登録。
-
登録されたXML Schema定義に対するXML文書の検証。
-
SQLオブジェクト型からのXML Schemaの生成。
-
他のユーザーが所有するXML Schemaの参照。
-
同じ名前のローカルXML Schemaが存在する場合に行うグローバルXML Schemaの参照。
-
XML Schemaの登録時にXML Schemaから行うデータベース・マッピングの生成。これには、SQLオブジェクト型、コレクション型およびデフォルト表の生成、およびXML Schema属性を使用するマッピング情報の取得が含まれます。
-
複数の許容されるマッピングが存在する場合に行う特定のSQL型マッピングの指定
-
登録されたXML Schemaに基づく
XMLType
表、ビューおよび列の作成。 -
XML Schemaに基づく
XMLType
表に対する操作および問合せ。 -
プロトコル(FTP、HTTP(S)/WebDAV)およびSQL以外の言語を使用して、XML Schemaに基づく文書がOracle XML DBリポジトリに挿入される場合に行う、デフォルト表へのデータの自動挿入。
- XML SchemaをOracle XML DBとともに使用する理由
XML Schemaを使用する一般的な理由は、検証、制約定義、記憶域の指定、および文書の挿入、格納およびアクセスの最適化などです。 - ネーミング、マッピングおよび記憶域を制御するためのXML Schemaの注釈付けの概要
W3CのXML Schema勧告では、ベンダー固有の注釈をXML Schemaに追加できます。Oracle XML DBでは、注釈を使用して、XML Schemaと各種データベース・オプションの間のマッピングを制御します。注釈を使用して、XMLデータを格納する表を指定できます。注釈は、オブジェクト・リレーショナル記憶域で特に役立ちます。 - DOM再現性
DOM再現性は、XML文書内のすべての情報が、無意味な空白を除いて維持されていることを意味します。DOM再現性を使用すると、Oracle XML DBに格納されたXML文書の精度および整合性を保証できます。 - XMLTypeのXML Schema関連メソッド
XML Schema操作のための最も重要なXMLType
メソッドは、isSchemaBased()
、getSchemaURL()
、schemaValidate()
、isSchemaValid()
、isSchemaValidated()
およびsetSchemaValidated()
です。
親トピック: XML Schemaの格納と問合せ: 基本
17.2.1 XML SchemaをOracle XML DBとともに使用する理由
XML Schemaを使用する一般的な理由は、検証、制約定義、記憶域の指定、および文書の挿入、格納およびアクセスの最適化などです。
-
XML Schemaの最も一般的な用途は、XMLインスタンス・ドキュメントが指定のXML Schemaに準拠していることを確認する、つまりXMLデータがその意図された定義に準拠していることを確認するメカニズムとして使用することです。この定義にはデータ型、許容される項目の出現回数および項目の長さが含まれます。
-
XML Schemaは、XMLType表または列の作成時に
制約
としても使用できます。たとえば、表または列を、XML Schemaで定義されたいずれかのグローバル要素に準拠するXML文書の格納用に制限できます。 -
Oracle XML DBでは、XML Schemaを、
XMLType
インスタンスのコンテンツをデータベース内に格納する方法を定義するメカニズムとしても使用します。XMLType
のバイナリXML記憶域モデルとオブジェクト・リレーショナル記憶域モデルは、いずれもXML Schemaの使用をサポートしています。XMLType
データをオブジェクト・リレーショナル形式で格納するとき、XML Schemaデータ型をSQLデータ型およびオブジェクト・リレーショナル形式の表および列に効率的にマップするためにXML Schemaが使用されます。 -
プロトコルFTPおよびHTTP(S)を使用して、XML Schemaに基づく文書をOracle XML DBに格納する場合、XML Schema情報によって文書の挿入の効率も向上します。
-
事前情報なしにXMLインスタンスを処理しなければならない場合、XML Schemaを使用すると、最適な格納、再現性およびアクセスを予測できます。
関連トピック
17.2.2 ネーミング、マッピングおよび記憶域を制御するためのXML Schemaの注釈付けの概要
W3CのXML Schema勧告では、ベンダー固有の注釈をXML Schemaに追加できます。Oracle XML DBでは、注釈を使用して、XML Schemaと各種データベース・オプションの間のマッピングを制御します。注釈を使用して、XMLデータを格納する表を指定できます。注釈は、オブジェクト・リレーショナル記憶域で特に役立ちます。
Oracle XML DBでXML Schema注釈を使用すると、次の操作が可能です。
-
XMLデータを格納するデータベース表の指定
-
XML Schemaデータ型とSQLデータ型(オブジェクト・リレーショナル記憶域の場合)の間のデフォルト・マッピングの上書き
-
XMLデータを格納するために作成されるデータベース・オブジェクトおよび属性の命名(オブジェクト・リレーショナル記憶域の場合)
例A-2に、注釈付き発注書XML Schemaを示します。これには、2つのXML名前空間が定義されています。
-
http://www.w3c.org/2001/XMLSchema
。これは、W3CによってSchema for Schemasのために予約されています。 -
http://xmlns.oracle.com/xdb
。これは、オラクル社によってOracle XML DBのスキーマ注釈用に予約されています。
XML Schemaに注釈を付けるには、最初にOracle XML DB名前空間を宣言する必要があります。Oracle XML DB名前空間は、http://xmlns.oracle.com/xdb
です。例A-2では、名前空間接頭辞xdb
を使用して、Oracle XML DB名前空間を短縮しています。
例A-2では、次のものを含めていくつかのXML Schema注釈を使用しています。
-
PurchaseOrder
要素内のdefaultTable
注釈。このXML Schemaに準拠するXML文書をpurchaseorder
というデータベース表に格納することを指定します。 -
SQLType
注釈。SQLType
の注釈が最初に出現したとき、complexType
要素PurchaseOrderType
から生成されたSQLデータ型の名前をpurchaseorder_t
と指定します。2番目の注釈
SQLType
では、complexType
要素LineItemType
から生成されたSQLデータ型の名前をlineitem_t
と指定します。 -
SQLCollType
注釈。これは、LineItem
要素のコレクションを管理するSQL VARRAY型の名前がlineitem_v
であることを指定します。 -
SQLName
注釈。purchaseorder_t
の各SQLオブジェクト属性の明示的な名前を提供します。
図17-2に、XMLSpyの「Oracle」タブを示します。このタブを使用すると、グラフィカル・エディタでの作業中にOracle XML DBの注釈をXML Schemaに容易に追加できます。
17.2.3 DOM再現性
DOM再現性は、XML文書内のすべての情報が、無意味な空白を除いて維持されていることを意味します。DOM再現性を使用すると、Oracle XML DBに格納されたXML文書の精度および整合性を保証できます。
ドキュメント・オブジェクト・モデル(DOM)の再現性とは、DOM検索のために、取得されたXML文書を元のXML文書と同じ構造に保持するという概念です。
DOM再現性がある場合、データベースから取得されたXMLデータは、無意味な空白のみを除いて、データベースに挿入される前と同一の情報を持ちます。「DOM再現性」という用語が使用されるのは、この種類の再現性はDOM検索で特に重要だからです。
XMLデータのバイナリXML記憶域では、重要な情報のすべてがバイナリXML形式にエンコードされ、DOM再現性を保証しています。
関連項目:
DOM再現性と、XMLデータのオブジェクト・リレーショナル記憶域の詳細は、SYS_XDBPD$とオブジェクト・リレーショナル記憶域のDOM再現性を参照してください。
17.2.4 XMLTypeのXML Schema関連メソッド
XML Schema操作のための最も重要なXMLType
メソッドは、isSchemaBased()
、getSchemaURL()
、schemaValidate()
、isSchemaValid()
、isSchemaValidated()
およびsetSchemaValidated()
です。
表17-1 XMLTypeのXML Schema関連メソッド
XMLTypeのメソッド | 説明 |
---|---|
isSchemaBased() |
|
getSchemaURL() |
|
schemaValidate() isSchemaValid() isSchemaValidated() setSchemaValidated() |
登録されているXML Schemaに対する |
17.3 Oracle XML DBへのXML Schemaの登録
XML SchemaをOracle XML DBで使用するには、登録する必要があります。その後、これを使用して、XMLType
表および列を作成したり、XML文書を検証することができます。スキーマ登録が失敗した場合、データベースは登録を試行する前の状態に復元されます。
すべてのDDL操作と同様に、XML Schema登録は、非トランザクション的なものです。しかし、登録は、次の意味において、アトミックです。
-
登録が正常に終了した場合、操作は自動コミットされます。
-
登録が失敗した場合、データベースは登録開始前の状態にロールバックされます。
XML Schemaの登録では、オブジェクト型および表が作成される可能性があるため、エラー・リカバリでは作成されたすべての型と表が削除されます。XML Schemaの登録プロセス全体はアトミックであることが保証されます。つまり、正常に終了するか、またはデータベースが登録の開始前の状態に復元されます。
XML SchemaをOracle XML DBに登録するには、次の2つの項目が必要です。
-
XML Schema文書。
-
Oracle Databaseに登録後、XML Schemaの一意の識別子として使用できる文字列。この一意の識別子は、XML Schemaで定義されたクラスのメンバーとしてXMLインスタンス・ドキュメントを識別するために使用されます。通常、識別子はURLの形式を取り、多くの場合、スキーマの場所を示すヒントまたは文書の場所を示すヒントとして参照されます。
注意:
XML Schemaを登録しても、Oracle XML DBリポジトリにすでにロードされておりXML Schemaを参照するインスタンス文書の状態には影響しません。
そのようなインスタンス・ドキュメントは、ロード時にXML Schemaに基づかないものとして扱われました。そのままの状態です。スキーマの登録後、XML Schemaに基づく文書を取得するには、そのような文書を削除して再ロードする必要があります。
- XML Schemaの登録操作
XML Schemaの登録の一部として、Oracle XML DBでは、XML Schemaに準拠するXMLインスタンスの格納、アクセスおよび操作を容易にするいくつかの操作が実行されます。 - Oracle XML DBへのXML Schemaの登録
PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
を使用してXML Schemaを登録する例を示します。このプロシージャの主なパラメータは、スキーマURL、スキーマ・ソース・ドキュメント、ソース・ドキュメントのエンコーディングのキャラクタ・セットID、およびスキーマの登録方法を指定するオプションです。 - XML Schema登録時のSQL型および表の作成
XML Schemaの登録によって、オブジェクト型および表が作成されます。 - グローバル要素のデフォルト表
デフォルトでは、すべてのグローバル要素に対して、システム生成名を持つ表が作成されます。かわりに使用する名前を指定できます。特定の要素に対してデフォルト表が作成されないようにできます。このようにすることで、XML Schemaに多数のグローバル要素定義が含まれる場合は特に、使用されるプロセッサ時間と領域を削減できます。 - 登録されたXML Schemaに依存するデータベース・オブジェクト
いくつかの種類のデータベース・オブジェクト(表、ビュー、他のXML Schema、およびXML Schemaを参照するカーソル)を、登録済XML Schemaに依存させることができます。 - ローカルXML SchemaおよびグローバルXML Schema
XML Schemaは、ローカル(デフォルトで所有者のみが参照可能)またはグローバル(デフォルトですべてのデータベース・ユーザーが参照可能)として登録できます。 - 完全修飾されたXML Schema URL
完全修飾されたXML Schema URLにより、特定のXML Schemaに対する明示的な参照が許可されます。URLの一部として、XML Schemaを所有するデータベース・ユーザーの名前が指定されます。完全修飾されたSchema URLは、Oracle XML DBの名前空間に属します。 - XML Schemaの削除
プロシージャDBMS_XMLSCHEMA.
deleteSchema
を使用すると、登録されたXML Schemaを削除できます。 - 登録されているすべてのXML Schemaのリスト
例では、Oracle XML DBに登録されているすべてのXML Schemaを示します。
親トピック: XML Schemaの格納と問合せ: 基本
17.3.1 XML Schemaの登録操作
XML Schemaの登録の一部として、Oracle XML DBでは、XML Schemaに準拠するXMLインスタンスの格納、アクセスおよび操作を容易にするいくつかの操作が実行されます。
これには次のものがあります。
-
XML Schemaデータ型のOracle XML DB記憶域へのマッピング。XML Schemaに基づくデータが格納される場合、その記憶域データ型はデフォルトのマッピングを使用して(およびオプションで、XML Schema注釈を使用して指定したマッピング情報を使用して)、XML Schemaデータ型から導かれます。バイナリXML記憶域では、XML Schema型はバイナリXMLエンコーディング型にマップされます。オブジェクト・リレーショナル記憶域の場合、XML Schemaの登録により、準拠する文書のオブジェクト・リレーショナル記憶域に対する適切なSQLオブジェクト型が作成されます。
-
デフォルト表の作成。XML Schema登録により、すべてのグローバル要素のためのデフォルト
XMLType
表が生成されます。XML Schema注釈を使用すると、表の名前を制御し、表の作成中に使用される列レベルおよび表レベルのSTORAGE句と制約を指定できます。
XML Schemaの登録後は、XML Schemaインスタンス・メカニズムを使用してXML Schemaを参照する文書を、Oracle XML DBで自動的に処理できます。オブジェクト・リレーショナル形式で格納されるXMLデータの場合、XML Schemaによって定義されたグローバル要素に限定したXMLType
表および列を作成できます。
17.3.2 Oracle XML DBへのXML Schemaの登録
PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
を使用してXML Schemaを登録する例を示します。このプロシージャの主なパラメータは、スキーマURL、スキーマ・ソース・ドキュメント、ソース・ドキュメントのエンコーディングのキャラクタ・セットID、およびスキーマの登録方法を指定するオプションです。
DBMS_XMLSCHEMA.registerSchema
の主なパラメータは次のとおりです。
-
SCHEMAURL
: XML SchemaのURL。これはOracle XML DB内のXML Schemaに対する一意の識別子です。通常、これはURLの形式ですが、そうでなくてもかまいません。Oracle XML DBでXML SchemaのURLを使用し、スキーマの場所を示すヒントをXML SchemaのURLと一致させることで、インスタンス文書を識別します。Oracle XML DBは、指定したURLで識別されるWebサーバーへのアクセスを試行しません。注意:
-
システム定義のXML Schemaと同じ
SCHEMAURL
を使用してXML Schemaを登録することはできません。 -
URLのプロトコル以外の部分は一意である必要があります。プロトコル部分(
http
、https
など)は、一意性に関するテストでは無視されます。
-
-
SCHEMADOC
: XML Schemaのソース・ドキュメント。この値は、VARCHAR
、CLOB
、BLOB
、BFILE
、XMLType
またはURIType
です。 -
CSID
:schemaDoc
の値がBFILE
またはBLOB
の場合の、ソース・ドキュメントのエンコーディングのキャラクタ・セットID。 -
OPTIONS
: XML Schemaの登録方法を指定するオプション。最も重要なオプションは、REGISTER_BINARYXML
であり、バイナリXML記憶域にXML Schemaが使用されることを示します。もう1つのオプションはREGISTER_NT_AS_IOT
で、これはOCTを索引構成表(IOT)として格納します。
例17-1では、例A-2の注釈付きXML Schemaを登録しています。
A-2では、XML Schemaの一意の識別子は次のとおりです。
http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd
XML Schema文書は、すでにOracle XML DBリポジトリ(/source/schemas/poSource/xsd/purchaseOrder.xsd
)にロードされています。
XML Schemaの登録時に、PL/SQLコンストラクタXDBURIType
がリポジトリ内のXML Schema文書の場所に基づいてXML Schema文書のコンテンツにアクセスすることを、オプションSCHEMADOC
で指定します。プロシージャregisterSchema
に渡される他のオプションによって、例A-2のスキーマをローカルXML Schema(オプションLOCAL
)として登録する必要があること、SQLオブジェクト、および登録プロセス(オプションGENTABLES
)で表を生成する必要があることが指定されます。
PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
は、次の操作を実行します。
-
XML Schemaの解析および検証
-
XML Schemaを記述するOracleデータ・ディクショナリ内の一連のエントリの作成
-
XML Schemaで定義された
complexType
要素に基づく一連のSQLオブジェクト定義の作成 -
XML Schemaで定義された各グローバル要素の
XMLType
表の作成
デフォルトでは、XML Schemaが登録されると、Oracle XML DBは、インスタンス・ドキュメントの管理に必要なすべてのSQLオブジェクト型とXMLType
表を自動的に生成します。XML Schemaは、グローバルまたはローカルとして登録できます。
関連項目:
DBMS_XMLSCHEMA.registerSchema
の詳細は、Oracle Database PL/SQLパッケージおよびタイプ・リファレンスを参照してください。
例17-1 DBMS_XMLSCHEMA.REGISTERSCHEMAを使用したXML Schemaの登録
BEGIN DBMS_XMLSCHEMA.registerSchema( SCHEMAURL => 'http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd', SCHEMADOC => XDBURIType('/source/schemas/poSource/xsd/purchaseOrder.xsd').getCLOB(), LOCAL => TRUE, GENTYPES => TRUE, GENTABLES => TRUE); END; /
17.3.3 XML Schema登録時のSQL型および表の作成
XML Schemaの登録によって、オブジェクト型および表が作成されます。
例17-2では、例17-1の場合のように、XML Schemaの登録中に作成されたSQL型定義を示しています。次のSQL型定義が含まれます。
-
purchaseorder_t
。この型を使用してPurchaseOrder
要素から生成されたSQLオブジェクトを永続的に保持します。PurchaseOrder
要素を含むXML文書がOracle XML DBに格納される場合、文書は分割され、文書のコンテンツはpurchaseorder_t
のインスタンスとして格納されます。 -
lineitems_t
、lineitem_v
およびlineitem_t
。これらの型はPurchaseOrder
文書に存在する可能性のあるLineItem
要素のコレクションを管理します。型lineitems_t
は、型lineitem_v
のインスタンスとして定義された単一の属性lineitem
で構成されます。型lineitem_v
はlinteitem_t
オブジェクトのVARRAYとして定義されます。文書内の各LineItem
要素に対し、lineitem_t
オブジェクトのインスタンスが1つずつあります。
例17-2 XML Schemaの登録時のオブジェクトの作成
DESCRIBE purchaseorder_t
purchaseorder_t is NOT FINAL
Name Null? Type
----------------------------------------- -------- ----------------------------
SYS_XDBPD$ XDB.XDB$RAW_LIST_T
REFERENCE VARCHAR2(30 CHAR)
ACTIONS ACTIONS_T
REJECTION REJECTION_T
REQUESTOR VARCHAR2(128 CHAR)
USERID VARCHAR2(10 CHAR)
COST_CENTER VARCHAR2(4 CHAR)
SHIPPING_INSTRUCTIONS SHIPPING_INSTRUCTIONS_T
SPECIAL_INSTRUCTIONS VARCHAR2(2048 CHAR)
LINEITEMS LINEITEMS_T
DESCRIBE lineitems_t
lineitems_t is NOT FINAL
Name Null? Type
----------------------------------------- -------- ----------------------------
SYS_XDBPD$ XDB.XDB$RAW_LIST_T
LINEITEM 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
親トピック: Oracle XML DBへのXML Schemaの登録
17.3.4 グローバル要素のデフォルト表
デフォルトでは、すべてのグローバル要素に対して、システム生成名を持つ表が作成されます。かわりに使用する名前を指定できます。特定の要素に対してデフォルト表が作成されないようにできます。このようにすることで、XML Schemaに多数のグローバル要素定義が含まれる場合は特に、使用されるプロセッサ時間と領域を削減できます。
デフォルトでは、XML Schemaがデータベースに登録するときに、Oracle XML DBは、XML Schemaにより定義される各グローバル要素に対してデフォルト表を生成します。
xdb:defaultTable
属性を使用して、特定のグローバル要素に対するデフォルト表の名前を指定できます。指定するxdb:defaultTable
属性値は、特定のデータベース・ユーザーにより登録されたすべてのスキーマ間で一意である必要があります。一部の要素に対して空でないデフォルト表名を指定しない場合、一意の名前が自動的に付けられます。
しかし実際には、ほとんどの場合、グローバル要素に対してデフォルト表を作成する必要はありません。XMLインスタンス・ドキュメントのルート要素として機能しない要素には、デフォルト表が使用されることはないため、デフォルト表は必要ありません。特に、XML Schemaに多数のグローバル要素定義が含まれている場合は、すべてのグローバル要素に対してデフォルト表を作成すると、プロセッサ時間に大量のオーバーヘッドが発生し、多くの領域が使用される可能性があります。
このため、一般に、どの文書内でもルート要素として使用されないことが確実なグローバル要素(または表外に格納されたローカル要素)に対しては、デフォルト表が作成されないようにすることができます。これを行うには、次のいずれかの方法を実行します。
-
XMLインスタンス・ドキュメントのルート要素として表示されない各グローバル要素の定義に、注釈
xdb:defaultTable =
""
(空の文字列)を追加します。この方法を使用すると、通常はデフォルト表を自動的に作成し、必要な場合にxdb:defaultTable = ""
を使用して明示的にデフォルト表の自動作成を禁止できます。 -
XML Schemaの登録時にパラメータ
GENTABLES
をFALSE
に設定し、インスタンス・ドキュメントのルート要素として正当に表示できる各グローバル要素に対してデフォルト表を手動で作成します。この方法を使用すると、デフォルト表の自動作成は行われません。必要な表のみを手動で作成します。
親トピック: Oracle XML DBへのXML Schemaの登録
17.3.5 登録されたXML Schemaに依存するデータベース・オブジェクト
いくつかの種類のデータベース・オブジェクト(表、ビュー、他のXML Schema、およびXML Schemaを参照するカーソル)を、登録済XML Schemaに依存させることができます。
より正確には、次のようになります。
-
XML Schemaの要素に準拠する
XMLType
列が含まれる表またはビュー。 -
定義の一部として指定のXML Schemaが含まれるか、またはインポートされるXML Schema。
-
XML Schemaを参照するカーソル。これには、パッケージ
DBMS_XMLGEN
のファンクション内部の参照が含まれます。このようなカーソルは、一時オブジェクトです。
親トピック: Oracle XML DBへのXML Schemaの登録
17.3.6 ローカルXML SchemaおよびグローバルXML Schema
XML Schemaは、ローカル(デフォルトで所有者のみが参照可能)またはグローバル(デフォルトですべてのデータベース・ユーザーが参照可能)として登録できます。
XML Schemaを登録する場合、PL/SQLパッケージDBMS_XMLSCHEMA
はOracle XML DBリポジトリに対応するリソースを追加します。XML SchemaのURLにより、リポジトリ内のXML Schemaリソースのパス名を判断します(また、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
のパラメータSCHEMAURL
にも関連付けられます)。
注意:
Oracle Enterprise Managerでは、ローカルおよびグローバルに登録されたXML Schemaは、それぞれプライベートおよびパブリックと呼ばれます。
- ローカルXML Schema
デフォルトでは、XML SchemaをOracle XML DBに登録すると、XML Schemaがローカルになります。つまり、登録したユーザーのみがこのXML Schemaの所有者になります。XML Schema文書への参照は、Oracle XML DBリポジトリのユーザー(データベース・スキーマ)名の下に格納されます。 - グローバルXML Schema
ローカルXML Schemaとは異なり、権限のあるユーザーは、DBMS_XMLSCHEMA
登録ファンクションで引数を指定することにより、XML SchemaをグローバルXML Schemaとして登録できます。これは、すべてのユーザーが参照できます。これはOracle XML DBリポジトリのフォルダ/sys/schemas/PUBLIC/
に格納されます。
親トピック: Oracle XML DBへのXML Schemaの登録
17.3.6.1 ローカルXML Schema
デフォルトでは、XML SchemaをOracle XML DBに登録すると、XML Schemaがローカルになります。つまり、登録したユーザーのみがこのXML Schemaの所有者になります。XML Schema文書への参照は、Oracle XML DBリポジトリのユーザー(データベース・スキーマ)名の下に格納されます。
このようなXML Schemaは、ローカルとして参照されます。デフォルトでは、これらのスキーマは、所有者であるユーザーのみが使用できます。Oracle XML DBでは、ローカルXML Schemaのリソースは、フォルダ/sys/schemas/
username
に作成されます。残りのリポジトリのパス名は、スキーマのURLから導出されます。
たとえば、XML Schema purchaseOrder.xsd
がユーザーQUINE
によってローカル・スキーマとして登録された場合は、次のパス名が指定されます。
/sys/schemas/QUINE/xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd
-
ALTER SESSION
-
CREATE PROCEDURE
-
CREATE SESSION
-
CREATE TABLE
-
CREATE TRIGGER
-
CREATE TYOE
注意:
通常、XMLType
表、列またはビューの定義、文書の検証などにXML Schemaを使用できるのは、このXML Schemaの所有者のみです。ただし、Oracle XML DBでは、完全修飾されたXML Schema URLをサポートしています。例: http://xmlns.oracle.com/xdb/schemas/QUINE/xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd
。権限のあるユーザーは、この拡張URLを使用して、他のユーザー(この場合は、ユーザーQUINE
)が所有するXML Schemaを指定できます。
例17-3 ローカルXML Schemaの登録
BEGIN
DBMS_XMLSCHEMA.registerSchema(
SCHEMAURL => 'http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd',
SCHEMADOC => bfilename('XMLDIR','purchaseOrder.xsd'),
LOCAL => TRUE,
GENTYPES => TRUE,
GENTABLES => FALSE,
CSID => nls_charset_id('AL32UTF8'));
END;
/
関連トピック
17.3.6.2 グローバルXML Schema
ローカルXML Schemaとは異なり、権限のあるユーザーは、DBMS_XMLSCHEMA
登録ファンクションで引数を指定することにより、XML SchemaをグローバルXML Schemaとして登録できます。これは、すべてのユーザーが参照できます。これはOracle XML DBリポジトリのフォルダ/sys/schemas/PUBLIC/
に格納されます。
注意:
フォルダ/sys/schemas/PUBLIC
へのアクセスはアクセス制御リスト(ACL)で制御されます。デフォルトでは、このフォルダにはデータベース管理者のみが書込み可能です。グローバルXMLスキーマを登録するには、このフォルダに対する書込み権限が必要です。このフォルダがデフォルトACLによって保護されている場合は、ロールXDBADMIN
によってこのディレクトリへの書込み権限も提供されます。リポジトリのアクセス制御を参照してください。
ローカル・スキーマは、既存のグローバル・スキーマと同じURLに登録できます。ローカル・スキーマは、常に同じ名前(URL)を持つグローバル・スキーマを非表示にします。
例17-4に、グローバル・スキーマの登録を示します。
例17-4 グローバルXML Schemaの登録
GRANT XDBADMIN TO QUINE; Grant succeeded. CONNECT quine Enter password: password Connected. BEGIN DBMS_XMLSCHEMA.registerSchema( SCHEMAURL => 'http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd', SCHEMADOC => bfilename('XMLDIR','purchaseOrder.xsd'), LOCAL => FALSE, GENTYPES => TRUE, GENTABLES => FALSE, CSID => nls_charset_id('AL32UTF8')); END; /
ユーザーQUINE
がこのグローバルXML Schemaを登録すると、次のパス名が指定されます。
/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd
データベース・ユーザーがXML Schemaをグローバルとして登録するには、このリソースを作成するための適切な権限(ACLアクセス)が必要です。
17.3.7 完全修飾されたXML Schema URL
完全修飾されたXML Schema URLにより、特定のXML Schemaに対する明示的な参照が許可されます。URLの一部として、XML Schemaを所有するデータベース・ユーザーの名前が指定されます。完全修飾されたSchema URLは、Oracle XML DBの名前空間に属します。
デフォルトでは、XML Schema URLは、データベースの現行のユーザーの範囲内で参照されます。XML Schema URLは、まず現在のデータベース・ユーザーが所有するローカルのXML Schemaの名前として解決されます。
-
対応するXML Schemaがない場合、グローバルXML Schemaの名前として解決されます。
-
対応するグローバルXML Schemaもない場合、Oracle XML DBでエラーが発生します。
Oracle XML DB名前空間は、次のとおりです。
http://xmlns.oracle.com/xdb/schemas/<database-user>/<schemaURL-minus-protocol>
たとえば、URLがhttp://www.example.com/po.xsd
の登録済のグローバルXML Schemaがあり、ユーザーQUINE
に、同じURLの登録済のローカルXML Schemaがあるとします。別のユーザーは、完全修飾されたXML SchemaのURLを使用して、次のとおりQUINE
が所有するスキーマを参照できます。
http://xmlns.oracle.com/xdb/schemas/QUINE/www.example.com/po.xsd
グローバルXML Schemaの完全修飾されたURLは次のとおりです。
http://xmlns.oracle.com/xdb/schemas/PUBLIC/www.example.com/po.xsd
親トピック: Oracle XML DBへのXML Schemaの登録
17.3.8 XML Schemaの削除
プロシージャDBMS_XMLSCHEMA.
deleteSchema
を使用すると、登録されたXML Schemaを削除できます。
これにより、次のことが行われます。
-
現行のユーザーが、Oracle XML DBリポジトリ内のXML Schemaに対応するリソースを削除するための適切な権限を取得していることが確認されます。XML Schemaのリソースに適切なACLを設定することによって、各ユーザーが削除できるXML Schemaを制御できます。
-
削除されるXML Schemaに依存する表がないかどうかが確認されます。そうした表がある場合は、エラーを表示して削除をキャンセルします。この確認は、オプション
delete_invalidate
またはdelete_cascade_force
の使用時には実行されません。その場合は、エラーは発生しません。 -
Oracle XML DBリポジトリ(フォルダ
/sys/schemas
)からXML Schema文書を削除します。 -
XML Schema文書がバイナリXMLインスタンスで使用されるために登録されていて、
delete_invalidate
とdelete_cascade_force
のいずれも使用されない場合を除き、DBA_XML_SCHEMAS
からXML Schema文書を削除します。 -
delete_cascade
またはdelete_cascade_force
のいずれかが使用される場合は、デフォルト表をドロップします。delete_cascade
が指定されていて、XML Schemaにも依存している他の表にインスタンスがある場合、エラーが発生します。
プロシージャDBMS_XMLSCHEMA.deleteSchema
のオプションDELETE_OPTION
では次の値を使用可能です。
-
DELETE_RESTRICT
: 依存関係が検知されると、エラーを表示し、削除をキャンセルします。これはデフォルトの動作です。 -
DELETE_INVALIDATE
: 依存関係が検知されてもエラーを表示しません。そのかわり、各依存関係に無効のマークを付けます。 -
DELETE_CASCADE
: XML Schema登録時に生成されたすべての型とデフォルト表を削除します。デフォルト表以外の表に格納されているXML Schemaに依存するインスタンスがある場合は、エラーを表示します。ただし、ANY_SCHEMA
を使用して作成されたXMLType
列に格納されているインスタンスについては、そのような場合もエラーを表示しません。バイナリXMLで使用するXML Schemaが登録されている場合は、DBA_XML_SCHEMAS
からXML Schemaを削除しません。 -
DELETE_CASCADE_FORCE
: XML Schema登録時に生成されたすべての型とデフォルト表を削除します。デフォルト表以外の表に格納されているXML Schemaに依存するインスタンスがある場合は、エラーを表示しません。そのかわり、各依存関係に無効のマークを付けます。XML SchemaをDBA_XML_SCHEMAS
から削除します。
例17-5はDELETE_CASCADE_FORCE
の使用方法を示しています。
バイナリXMLで使用するXML Schemaが登録されている場合、オプションDELETE_RESTRICT
(デフォルト値)またはDELETE_CASCADE
を使用してXML Schemaを削除しても、DBA_XML_SCHEMAS
からは削除されません。そのため、XML Schemaを使用して新しいXMLインスタンス・ドキュメントをエンコードすることはできませんが、XML Schemaを参照するOracle XML DB内の既存のドキュメントは、引き続きXML Schemaを使用してデコードできます。
この状況は、DBMS_XMLSCHEMA.
purgeSchema
を使用してDBA_XML_SCHEMAS
からXML Schemaを削除するまで続きます。一般的には、delete_restrict
またはdelete_cascade
を使用することをお薦めします。そのXML Schemaが完全に不要であると確信している場合、DELETE_CASCADE_FORCE
でなく、DBMS_XMLSCHEMA.purgeSchema
をコールしてください。
プロシージャpurgeSchema
は、Oracle XML DBからXML Schemaを完全に削除します。特に、DBA_XML_SCHEMAS
から削除します。DBMS_XMLSCHEMA.purgeSchema
を使用する前に、消去されるXML Schemaを参照している既存のすべてのXML文書が、別のXML Schemaを参照するか、XML Schemaを参照しないように変換されていることを確認してください。そうしない場合、消去後にそれらの文書をデコードできなくなります。
例17-5 DBMS_XMLSCHEMA.DELETESCHEMAを使用したXML Schemaの削除
BEGIN
DBMS_XMLSCHEMA.deleteSchema(
SCHEMAURL => 'http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd',
DELETE_OPTION => DBMS_XMLSCHEMA.DELETE_CASCADE_FORCE);
END;
/
親トピック: Oracle XML DBへのXML Schemaの登録
17.3.9 登録されているすべてのXML Schemaのリスト
例では、Oracle XML DBに登録されているすべてのXML Schemaを示します。
例17-6に、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
を使用してOracle XML DBで登録されているすべてのXML Schemaのリストを取得する方法を示します。ビューUSER_XML_SCHEMAS
、ALL_XML_SCHEMAS
、USER_XML_TABLES
およびALL_XML_TABLES
も調べることができます。
例17-6 登録されたスキーマのデータ・ディクショナリ表
DESCRIBE DBA_XML_SCHEMAS
Name Null? Type
------------ ----- -----------------------
OWNER VARCHAR2(30)
SCHEMA_URL VARCHAR2(700)
LOCAL VARCHAR2(3)
SCHEMA XMLTYPE(XMLSchema "http://xmlns.oracle.com/xdb/XDBSchema.xsd"
Element "schema")
INT_OBJNAME VARCHAR2(4000)
QUAL_SCHEMA_URL VARCHAR2(767)
HIER_TYPE VARCHAR2(11)
BINARY VARCHAR2(3)
SCHEMA_ID RAW(16)
HIDDEN VARCHAR2(3)
SELECT OWNER, LOCAL, SCHEMA_URL FROM DBA_XML_SCHEMAS;
OWNER LOC SCHEMA_URL
----- --- ----------------------
XDB NO http://xmlns.oracle.com/xdb/XDBSchema.xsd
XDB NO http://xmlns.oracle.com/xdb/XDBResource.xsd
XDB NO http://xmlns.oracle.com/xdb/acl.xsd
XDB NO http://xmlns.oracle.com/xdb/dav.xsd
XDB NO http://xmlns.oracle.com/xdb/XDBStandard.xsd
XDB NO http://www.w3.org/2001/xml.xsd
XDB NO http://xmlns.oracle.com/xdb/stats.xsd
XDB NO http://xmlns.oracle.com/xdb/xdbconfig.xsd
SCOTT YES http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd
13 rows selected.
DESCRIBE DBA_XML_TABLES
Name Null? Type
------------ ----- -----------------------
OWNER VARCHAR2(30)
TABLE_NAME VARCHAR2(30)
XMLSCHEMA VARCHAR2(700)
SCHEMA_OWNER VARCHAR2(30)
ELEMENT_NAME VARCHAR2(2000)
STORAGE_TYPE VARCHAR2(17)
ANYSCHEMA VARCHAR2(3)
NONSCHEMA VARCHAR2(3)
SELECT TABLE_NAME FROM DBA_XML_TABLES
WHERE XMLSCHEMA = 'http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd';
TABLE_NAME
---------------------
PurchaseOrder1669_TAB
1 row selected.
親トピック: Oracle XML DBへのXML Schemaの登録
17.4 XML Schemaに基づくXMLType表および列の作成
XML Schemaによって定義されたグローバル要素に限定したXMLType
表および列を作成できます。XMLType
列を特定の要素および特定のスキーマに限定すると、以降はその要素のスキーマ定義に準拠している文書のみを含めることができます。
XMLType
表の列は、CREATE TABLE
操作に適切なXMLSCHEMA
およびELEMENT
句を追加することで、特定の要素およびXML Schemaに制限されます。
図17-3から図17-6に、XMLType
表を作成するための構文を示します。
関連項目:
object_properties
のような構文要素を含むCREATE TABLE
の詳しい説明は、Oracle Database SQL言語リファレンスを参照してください。
注意:
各自のデータベース・スキーマと異なるデータベース・スキーマにXMLType
表を作成するには、権限CREATE ANY TABLE
だけでなく、権限CREATE ANY INDEX
も必要です。これは、表の作成時に列OBJECT_ID
に一意索引が作成されるためです。列OBJECT_ID
には、システム生成のオブジェクト識別子が格納されます。
注意:
-
XMLType_virtual_columns
句は、バイナリXML
として格納されているXMLTypeデータに対してのみ使用できます。具体的には、オブジェクト・リレーショナル形式で格納されているデータに対して使用した場合に、パーティショニング句を使用すると、エラーが発生します。 -
XMLデータの場合は、仮想列は主にSQLの制約のパーティション化や定義に使用されます。特定のXMLデータにリレーショナル形式でアクセスするためにそれを投影する必要がある場合、SQL/XML関数
XMLTable
またはXMLIndex
と構造化コンポーネントの使用を考慮してください。
XPointer表記法のサブセットを使用して、XML Schemaの場所および要素名を含む1つのURLを指定することもできます。XMLデータの問合せと更新も参照してください。
例17-7は、2つのCREATE TABLE
文を示しています。最初の文は、XMLType
表purchaseorder_as_table
を作成します。2番目の文は、XMLType
列xml_document
を備えたリレーショナル表purchaseorder_as_column
を作成します。各表で、XMLType
インスタンスは、URL http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd
で登録したXML Schemaによって定義されたPurchaseOrder
要素に限定されます。
XMLSchema
およびElement
を指定するには、次の2つの方法があります。
-
XMLSchema
およびElement
を別の句として指定する方法 -
XPointer表記法で
Element
句のみを使用する方法
XML Schemaに制限されるXMLType
表または列に関連付けられているデータは、数種類の異なる方法で格納できます。
-
オブジェクト・リレーショナル形式に分解して格納する方法
-
単一のXML列を使用してバイナリXML形式で格納する方法
例17-7 XML Schemaに基づくXMLType表および列の作成
CREATE TABLE purchaseorder_as_table OF XMLType
XMLSCHEMA "http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd"
ELEMENT "PurchaseOrder";
CREATE TABLE purchaseorder_as_column (id NUMBER, xml_document XMLType)
XMLTYPE COLUMN xml_document
ELEMENT
"http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd#PurchaseOrder";
- XML Schemaに基づくデータのXMLType記憶域オプションの指定
XML Schemaを参照するXMLインスタンス・ドキュメントを格納する表を手動で作成する場合、使用する記憶域オプションを指定できます。特定のXMLType
記憶域モデルを指定するには、CREATE TABLE文でSTORE AS
句を使用します。
親トピック: XML Schemaの格納と問合せ: 基本
17.4.1 XML Schemaに基づくデータのXMLType記憶域オプションの指定
XML Schemaを参照するXMLインスタンス・ドキュメントを格納する表を手動で作成する場合、使用する記憶域オプションを指定できます。特定のXMLType
記憶域モデルを指定するには、CREATE TABLE文でSTORE AS
句を使用します。
それ以外の場合は、XML Schemaの登録時に指定した記憶域モデルが使用されます。登録時に記憶域モデルが指定されなかった場合、オブジェクト・リレーショナル記憶域が使用されます。
XML Schemaに基づくデータの記憶域オプションの指定に加えて、XML Schema注釈を使用して、自動的に作成される表の記憶域オプションを指定することもできます。
- XML Schemaに基づくデータのバイナリXML記憶域
STORE AS BINARY_XML
を指定すると、バイナリXML記憶域が使用されます。文書が準拠する必要があるXML Schemaを指定する場合、バイナリXMLとして格納されるXMLType
表および列を作成するためにだけ、そのXML Schemaを使用できます。 - XML Schemaに基づくデータのオブジェクト・リレーショナル記憶域
XML Schemaを登録した後、そのXML Schemaに準拠する文書に対するオブジェクト・リレーショナルXMLType
表または列を作成できます。オプションで、表または列に対してオブジェクト・リレーショナル記憶域オプションを指定できます。
17.4.1.1 XML Schemaに基づくデータのバイナリXML記憶域
STORE AS BINARY_XML
を指定すると、バイナリXML記憶域が使用されます。文書が準拠する必要があるXML Schemaを指定する場合、バイナリXMLとして格納されるXMLType
表および列を作成するためにだけ、そのXML Schemaを使用できます。
同じXML Schemaを使用して、オブジェクト・リレーショナル形式で格納されるXMLType
表および列を作成することはできません。
逆も成り立ちます。登録されたXML Schemaに対してオブジェクト・リレーショナル記憶域を使用する場合、そのXML Schemaを使用して作成できるのは、バイナリXMLとして格納されるXMLType
表および列のみです。
バイナリXML記憶域は、特にXML Schemaの使用に関して、XMLデータに対する非常に高い柔軟性を提供します。バイナリXMLによるXMLデータのエンコードは、XML Schemaがエンコーディングに使用されるかどうかにより異なります。別のXML Schemaを使用して、同じデータを違う方式でエンコードすることができます。
バイナリXMLデータのエンコーディングでXML Schemaを考慮すると、XML Schemaデータ型が、格納の際にエンコードされる型にマップされます。別の方法として、データがXML Schemaを参照するかどうかに関係なく、スキーマに基づかないバイナリXMLとしてXMLデータをエンコードすることもできます。その場合、参照されているXML Schemaは無視され、XML Schemaデータ型のエンコーディングはありません。
XMLType
表または列を作成する場合、バイナリXML記憶域を使用すると、XML Schemaを利用するために、列または表をエンコードする方法を指定できます。以下から選択してください。
-
列または表をスキーマに基づかないバイナリXMLとしてエンコードします。その場合でも列に格納するXMLデータをXML Schemaに準拠させることはできますが、その必要はありません。エンコーディングの目的では、参照されているXML Schemaはすべて無視されます。文書は、挿入または更新時に自動的に検証されません。
その場合でも、スキーマに基づかないバイナリXMLとしてエンコードされた、XML Schemaに基づく文書を明示的に検証することができます。これは、文書を変更または削除する可能性があるため、特定のXML Schemaにあまり密接に結び付けたくない場合という、重要なユースケースを表しています。
-
1つのXML Schemaに準拠する列または表データをエンコードします。すべての行(文書)が同一のXML Schemaに準拠する必要があります。その場合でも、オプションとして、スキーマに基づかない文書も同一の列に格納できるように指定することができます。
-
参照しているあらゆるXML schemaに準拠するように列または表データをエンコードします。各行(文書)は任意のXML Schemaを参照でき、そのXML Schemaを使用してその特定のXML文書をエンコードします。この場合も、オプションとして、スキーマに基づかない文書も同一の列に格納できるように指定することができます。
この方法で、同じXML Schemaの複数のバージョンを使用できます。異なるバージョンに準拠する文書を格納します。それぞれが、参照するXML Schemaに従ってエンコードされます。
エンコーディングにあらゆるXML Schemaを使用できるように指定するには、表を作成する際にオプションALLOW ANYSCHEMA
を使用します。
注意:
-
ALLOW ANYSCHEMA
オプションを使用すると、インスタンス・ドキュメントで参照されるXML Schemaは検証のみに使用されます。問合せ時には使用されません。データの問合せでは、XML Schemaに基づかないデータのように扱われます。 -
コピーに基づくXML Schemaの拡張を使用することが見込まれる場合、オプション
ALLOW ANYSCHEMA
を使用しないことをお薦めします(コピーに基づくスキーマの拡張を参照)。このオプションを使用する場合、拡張されたXML Schemaにどの行(文書)が準拠するか決定することは不可能です。コピーに基づく拡張時には準拠する行は変換されず、後からデコード可能になることもありません。
ALLOW NONSCHEMA
オプションを使用すると、XML Schemaに基づくエンコーディングを使用する表や列に対して、スキーマに基づかない文書も受け入れることができるように指定できます。キーワードXMLSCHEMA
がない場合、エンコーディングはスキーマに基づかない文書に対して行われます。キーワードALLOW NONSCHEMA
はないが、キーワードXMLSCHEMA
がある場合、エンコーディングは、指定された単一のXML Schemaに対して行われます。キーワードALLOW NONSCHEMA
はないが、キーワードALLOW ANYSCHEMA
がある場合、エンコーディングは、参照されているあらゆるXML Schemaに対して行われます。
XML文書を、文書に対応しないXMLType
表または列に挿入しようとすると、エラーが発生します。
可能なオプションについて表17-2にまとめます。
表17-2 バイナリXMLのためのCREATE TABLEエンコード・オプション
記憶域オプション | エンコードの説明 |
---|---|
STORE AS BINARY XML |
スキーマに基づかないエンコーディングを使用してすべての文書をエンコードします。 |
STORE AS BINARY XML XMLSCHEMA ... |
参照されたXML Schemaに基づくエンコーディングを使用してすべての文書をエンコードします。 エラーをXML Schemaに準拠しない文書を挿入あるいは更新しようとするとエラーが発生します。 |
STORE AS BINARY XML XMLSCHEMA ... ALLOW NONSCHEMA |
参照されたXML Schemaに基づくエンコーディングを使用して、XML Schemaに基づくすべての文書をエンコードします。スキーマに基づかないエンコーディングを使用して、スキーマに基づかないすべての文書をエンコードします。 参照されているXML Schemaに準拠していないXML Schemaに基づく文書を挿入あるいは更新しようとするとエラーが発生します。 |
STORE AS BINARY XML ALLOW ANYSCHEMA |
文書により参照されたXML Schemaに基づくエンコーディングを使用して、XML Schemaに基づくすべての文書をエンコードします。 登録されたXML Schemaを参照しないか、参照するXML Schemaに準拠しない文書を挿入あるいは更新しようとすると、エラーが発生します。 |
STORE AS BINARY XML ALLOW ANYSCHEMA ALLOW NONSCHEMA |
文書により参照されたXML Schemaに基づくエンコーディングを使用して、XML Schemaに基づくすべての文書をエンコードします。スキーマに基づかないエンコーディングを使用して、スキーマに基づかないすべての文書をエンコードします。 参照している登録済XML Schemaに準拠していないXML Schemaに基づく文書を挿入あるいは更新しようとするとエラーが発生します。 |
注意:
CREATE TABLE
をALLOW NONSCHEMA
とともに使用し、ALLOW ANYSCHEMA
とともには使用しない場合、XML Schemaに基づく文書を含むすべての文書が、XML Schemaに基づかないエンコーディングを使用してエンコードされます。後で、同じ表でALTER TABLE
をALLOW ANYSCHEMA
とともに使用する場合、ALTER TABLE
操作より前に格納された文書のエンコーディングには影響を与えません。このような文書はすべて、XML Schemaを参照するかどうかにかかわらず、XML Schemaに基づかないエンコーディングを使用して引き続きエンコードされます。ALTER TABLE
操作より後で表に挿入されるXML Schemaに基づく文書のみが、XML Schemaに基づくエンコーディングを使用してエンコードされます。
17.4.1.2 XML Schemaに基づくデータのオブジェクト・リレーショナル記憶域
XML Schemaを登録した後、そのXML Schemaに準拠する文書に対するオブジェクト・リレーショナルXMLType
表または列を作成できます。オプションで、表または列に対してオブジェクト・リレーショナル記憶域オプションを指定できます。
URL http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd
によって識別される発注書XML Schemaを登録したと仮定します。次に、例17-8のように、XML Schemaの要素PurchaseOrder
に準拠したインスタンスを格納するオブジェクト・リレーショナル形式のXMLType
表、purchaseorder_as_table
を作成します。
これで、PurchaseOrder
要素がマップされているデータベース・オブジェクト・タイプに対応する非表示の列が自動的に作成されます。また、名前空間宣言など、最上位インスタンスのデータを格納するためのXMLEXTRA
オブジェクト列が作成されます。XMLEXTRA
は、内部での使用に予約されています。
XML Schema purchaseOrder.xsd
に、要素LineItems
が要素PurchaseOrder
の子として定義されており、LineItems
がLineItem
要素のコレクションであると仮定します。
オブジェクト・リレーショナル記憶域では、コレクションはSQL VARRAY値にマップされます。XMLのコレクションはXML Schemaによって定義される任意の要素であり、maxOccurs
> 1であるため複数回出現できます。このようなVARRAYのコンテンツ全体は、デフォルトでOrdered Collection Table(OCT)内に一連の行として格納されます。
例17-9では、例17-8とは異なる表purchaseorder_as_table
を作成しています。ここでは、次のように追加の記憶域オプションを指定します。
-
LineItems
コレクションのVARRAYは、表ではなくLOBとして格納されます。 -
表領域
USERS
は、要素Notes
の格納に使用されます。 -
表は、オンライン・トランザクション処理(OLTP)のために圧縮されます。
注意:
Oracle Database 11gR2より前のリリースでは、CREATE TABLE
のデフォルトの動作は、表としてではなく、LOBとして格納されたVARRAYを使用してコレクションを格納していました。
注意:
親のXMLType
表または列に圧縮を指定する場合、すべての子孫XMLType
Ordered Collection Tables(OCT)も同様に圧縮されます。
関連項目:
-
XML Schema注釈を使用した記憶域オプションの指定の詳細は、OracleでのXML Schemaの注釈を参照してください。
-
OLTPの圧縮の詳細は、Oracle Database SQL言語リファレンスを参照してください。
XMLType表または列のすべての
VARRAYをLOBまたは表として格納するように指定する必要がある場合は、便利な方法として、構文のSTORE ALL VARRAYS AS
句の後に、LOBS
またはTABLES
をそれぞれ使用できます。これは、コレクションごとに複数のVARRAY
...STORE AS
句を使用する方法の代替策となる便利な方法です。例17-10に、これを示します。
関連項目:
STORE ALL VARRAYS AS LOBS
の使用方法の詳細は、Oracle Database SQL言語リファレンスを参照してください。
例17-8 デフォルト記憶域でのオブジェクト・リレーショナル形式のXMLType表の作成
CREATE TABLE purchaseorder_as_table OF XMLType ELEMENT "http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd#PurchaseOrder";
例17-9 XMLType表および列に対するオブジェクト・リレーショナル記憶域オプションの指定
CREATE TABLE purchaseorder_as_table OF XMLType (UNIQUE ("XMLDATA"."Reference"), FOREIGN KEY ("XMLDATA"."User") REFERENCES hr.employees (email)) ELEMENT "http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd#PurchaseOrder" VARRAY "XMLDATA"."LineItems"."LineItem" STORE AS LOB lineitem_lob LOB ("XMLDATA"."Notes") STORE AS (TABLESPACE USERS ENABLE STORAGE IN ROW STORAGE(INITIAL 4K NEXT 32K)) COMPRESS FOR OLTP; CREATE TABLE purchaseorder_as_column ( id NUMBER, xml_document XMLType, UNIQUE (xml_document."XMLDATA"."Reference"), FOREIGN KEY (xml_document."XMLDATA"."User") REFERENCES hr.employees (email)) XMLTYPE COLUMN xml_document XMLSCHEMA "http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd" ELEMENT "PurchaseOrder" VARRAY xml_document."XMLDATA"."LineItems"."LineItem" STORE AS LOB lineitem_lob LOB (xml_document."XMLDATA"."Notes") STORE AS (TABLESPACE USERS ENABLE STORAGE IN ROW STORAGE(INITIAL 4K NEXT 32K)) COMPRESS FOR OLTP;
例17-10 STORE ALL VARRAYS ASの使用
CREATE TABLE purchaseorder_as_table OF XMLType (UNIQUE ("XMLDATA"."Reference"),
FOREIGN KEY ("XMLDATA"."User") REFERENCES hr.employees (email))
ELEMENT
"http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd#PurchaseOrder"
STORE ALL VARRAYS AS LOBS;
17.5 XML Schemaインスタンス・ドキュメントの識別方法
XML文書をXML Schemaに基づくXMLType
表または列に挿入する前に、関連付けられているXML Schemaを識別する必要があります。表または列の作成時にこれを実行することも、XMLSchema-instance
を使用して、必要なスキーマ識別を明示的にXMLインスタンス・ドキュメントに追加することもできます。
XMLType
表または列の作成時にXML Schemaを明示的に識別するには、XML Schemaの名前をXMLType
コンストラクタに渡すか、またはXMLType
のcreateSchemaBasedXML()
メソッドを起動します。
XMLSchema-instance
メカニズムのメリットは、Oracle XML DBリポジトリに挿入されたXML文書が登録済のXML SchemaのインスタンスであることをOracle XML DBプロトコル・サーバーが認識できることです。インスタンス・ドキュメントのコンテンツは、そのXML Schemaで指定されたデフォルト表に自動的に格納されます。
XMLSchema-instance
メカニズムは、W3CのXML Schemaワーキング・グループにより定義されています。この基本は、ターゲットのXMLスキーマを識別する属性をインスタンス・ドキュメントのルート要素に追加することです。これらの属性はXMLSchema-instance
名前空間で定義されます。
インスタンス・ドキュメントを特定のXML Schemaで定義されたクラスのメンバーとして識別するには、名前空間宣言をインスタンス・ドキュメントのルート要素に追加して、XMLSchema-instance
名前空間を宣言する必要があります。例:
xmlns:xsi = http://www.w3.org/2001/XMLSchema-instance
XMLSchema-instance
名前空間が宣言され、namespace
接頭辞が指定されると、XML Schemaを識別する属性をインスタンス・ドキュメントのルート要素に追加できます。前述の例では、XMLSchema-instance
名前空間の名前空間接頭辞がxsi
と定義されています。この接頭辞は、XMLSchema-instance
の属性をインスタンス・ドキュメントのルート要素に追加する際に使用できます。
追加する属性は、いくつかの要因によって決定します。noNamespaceSchemaLocation
およびschemaLocation
に、その可能性があります。インスタンス・ドキュメントが関連付けられているXML Schemaを識別するには、XML Schemaに応じて、1つまたは両方の属性が必要です。
- 属性noNamespaceSchemaLocationおよびschemaLocation
ターゲットXML Schemaでターゲットの名前空間が宣言されていない場合は、noNamespaceSchemaLocation
属性を使用してXML Schemaを識別します。この属性値はスキーマの場所を示すヒントです。この値は、XML Schemaをデータベースに登録するときにPL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
に渡される一意の識別子です。 - XML Schemaおよび複数の名前空間
XML Schemaに複数の名前空間で定義された要素が含まれるときは、各XML SchemaのschemaLocation
属性でエントリを発生させる必要があります。各エントリは、名前空間宣言およびスキーマの場所を示すヒントで構成されています。
親トピック: XML Schemaの格納と問合せ: 基本
17.5.1 属性noNamespaceSchemaLocationおよびschemaLocation
ターゲットXML Schemaでターゲットの名前空間が宣言されていない場合は、noNamespaceSchemaLocation
属性を使用してXML Schemaを識別します。この属性値はスキーマの場所を示すヒントです。この値は、XML Schemaをデータベースに登録するときにPL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
に渡される一意の識別子です。
XML Schema purchaseOrder.xsd
の場合、インスタンス・ドキュメントのルート要素の正しい定義は次のとおりです。
<PurchaseOrder
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:noNamespaceSchemaLocation=
"http://localhost:8080/source/schemas/poSource/xsd/purchaseOrder.xsd">
ターゲットのXML Schemaでターゲットの名前空間が宣言されている場合は、schemaLocation
属性を使用してXML Schemaを識別します。この属性の値は2つの値の組合せで、空白によって区切られています。
-
XML Schemaで宣言されたターゲットの名前空間の値
-
スキーマをデータベースに登録するときにプロシージャ
DBMS_XMLSCHEMA.registerSchema
に渡される一意の識別子である、スキーマの場所を示すヒント
たとえば、XML Schema PurchaseOrder
にターゲットの名前空間宣言が含まれているとします。この場合、スキーマのルート要素は次のようになります。
<xs:schema targetNamespace="http://demo.oracle.com/xdb/purchaseOrder"
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"/>
この場合、インスタンス・ドキュメントのルート要素の正しい形式は次のとおりです。
<PurchaseOrder
xnlns="http://demo.oracle.com/xdb/purchaseOrder"
xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance
xsi:schemaLocation=
"http://demo.oracle.com/xdb/purchaseOrder
http://mdrake-lap:8080/source/schemas/poSource/xsd/purchaseOrder.xsd">
親トピック: XML Schemaインスタンス・ドキュメントの識別方法
17.5.2 XML Schemaおよび複数の名前空間
XML Schemaに複数の名前空間で定義された要素が含まれるときは、各XML SchemaのschemaLocation
属性でエントリを発生させる必要があります。各エントリは、名前空間宣言およびスキーマの場所を示すヒントで構成されています。
また、各エントリは1つ以上の空白文字で区切られています。
主要なXML Schemaでターゲットの名前空間が宣言されていない場合でも、主要なXML Schemaのスキーマの場所を示すヒントを指定するnoNamespaceSchemaLocation
属性をXMLインスタンス・ドキュメントに含める必要があります。
親トピック: XML Schemaインスタンス・ドキュメントの識別方法
17.6 XML Schemaデータ型のOracle XML DB記憶域へのマッピング
XML Schemaに準拠するデータは、XML Schemaデータ型を使用します。このXMLデータがOracle XML DBに格納される場合、その記憶域データ型はデフォルトのマッピングを使用して(およびオプションで、XML Schema注釈を使用して指定したマッピング情報を使用して)、XML Schemaデータ型から導かれます。
記憶域に対して使用するデータ型を指定しない場合、Oracle XML DBは登録時に、デフォルトのマッピングを使用して適切にXML Schemaに注釈を付けます。こうすると、登録されたXML Schemaに、データ型注釈の完全なセットが含まれます。
-
オブジェクト・リレーショナル記憶域では、XML Schemaデータ型がSQLデータ型にマップされます。
-
バイナリXML記憶域では、XML Schemaデータ型はOracle XML DBバイナリXMLエンコーディング型にマップされます。
図17-7に、Oracle XML DBで、XML文書およびXML Schemaに指定されたマッピングを使用して、XML Schemaに基づくXMLType
表を作成する方法を示します。XML Schemaで指定された格納方式に応じて、XMLインスタンス・ドキュメントは、バイナリXMLの値として単一のXMLType
列に格納されるか、複数のオブジェクト・リレーショナル列を使用して格納されます。
図17-7 Oracle XML DBによるXML Schemaに基づくXMLType表のマッピング方法
「図17-7 Oracle XML DBによるXML Schemaに基づくXMLType表のマッピング方法」の説明
脚注の説明
脚注1:XMLSpyは、WebDAVおよびFTPプロトコルもサポートしているため、それを使用して、Oracle XML DBリポジトリに格納されているコンテンツに直接アクセスして編集できます。