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

前
次

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にはない追加機能があります。

関連項目:

17.1 XML Schemaの概要

W3CのXML Schema勧告では、一連のXML文書の構造、コンテンツおよび特定のセマンティクスを指定するための標準化された言語が定義されています。XML Schemaは、XML文書のクラスを示すメタデータとみなすことができます。

XML Schema勧告については、http://www.w3.org/TR/xmlschema-0/を参照してください。

このドキュメントで、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は(http://www.w3.org/2001/XMLSchemaで公開されている)XML Schemaで定義されたクラスに準拠するXML文書です。

17.1.2 XML Schemaの機能

XML Schemaは、要素と属性の厳密な型指定のために、47のスカラー・データ型を定義しています。これは、オブジェクト指向の継承および拡張をサポートしているため、基本データ型から複合オブジェクトを持つXML Schemaを設計できます。これには、定義および順序付けの構造体、デフォルト値、必須コンテンツ、ネスト、セットの繰返しおよび再定義が含まれます。

Oracle XML DBは、XML Schemaで定義されたすべての構造体をサポートします(redefinesを除く)。

17.1.3 XMLインスタンス・ドキュメント

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を指定します。

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文書の作成と編集に使用できます。詳細は、http://www.altova.comを参照してください。脚注1

図17-1 XML Schema Purchase-OrderのXMLSpyによるグラフィカル表現

図17-1の説明が続きます
「図17-1 XML Schema Purchase-OrderのXMLSpyによるグラフィカル表現」の説明

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リポジトリに挿入される場合に行う、デフォルト表へのデータの自動挿入。

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 XMLSpyにおけるOracle XML DB Schema注釈のサポート

図17-2の説明が続きます
「図17-2 XMLSpyにおけるOracle XML DB 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()

XMLTypeインスタンスがXML Schemaに基づいている場合は、TRUEが戻されます。それ以外の場合は、FALSEが戻されます。

getSchemaURL() 

XMLTypeインスタンスのXML Schema URL。

schemaValidate()
isSchemaValid()
isSchemaValidated()
setSchemaValidated()

登録されているXML Schemaに対するXMLTypeインスタンスの検証: 検証、検証ステータスのチェック、または記録された検証ステータスの設定。 XMLTypeデータの変換および検証を参照してください。

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に基づく文書を取得するには、そのような文書を削除して再ロードする必要があります。

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を登録することはできません。

  • SCHEMADOC - XML Schemaのソース・ドキュメント。この値は、VARCHARCLOBBLOBBFILEXMLTypeまたはURITypeです。

  • CSID - schemaDocの値がBFILEまたはBLOBの場合の、ソース・ドキュメントのエンコーディングのキャラクタ・セットID。

  • OPTIONS: XML Schemaの登録方法を指定するオプション。最も重要なオプションは、REGISTER_BINARYXMLであり、バイナリXML記憶域にXML Schemaが使用されることを示します。もう1つのオプションはREGISTER_NT_AS_IOTで、これはOCTを索引構成表(IOT)として格納します。

関連項目:

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

例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は、グローバルまたはローカルとして登録できます。

関連項目:

例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_tlineitem_vおよびlineitem_t。これらの型はPurchaseOrder文書に存在する可能性のあるLineItem要素のコレクションを管理します。型lineitems_tは、型lineitem_vのインスタンスとして定義された単一の属性lineitemで構成されます。型lineitem_vlinteitem_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

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の登録時にパラメータGENTABLESFALSEに設定し、インスタンス・ドキュメントのルート要素として正当に表示できる各グローバル要素に対してデフォルト表を手動で作成します。この方法を使用すると、デフォルト表の自動作成は行われません。必要な表のみを手動で作成します。

17.3.5 登録されたXML Schemaに依存するデータベース・オブジェクト

いくつかの種類のデータベース・オブジェクト(表、ビュー、他のXML Schema、およびXML Schemaを参照するカーソル)を、登録済XML Schemaに依存させることができます。

正確には、次のようになります。

  • XML Schemaの要素に準拠するXMLType列が含まれる表またはビュー。

  • 定義の一部として指定のXML Schemaが含まれるか、またはインポートされるXML Schema。

  • XML Schemaを参照するカーソル。これには、パッケージDBMS_XMLGENのファンクション内部の参照が含まれます。このようなカーソルは、一時オブジェクトです。

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は、それぞれプライベートおよびパブリックと呼ばれます。

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

データベース・ユーザーがXML SchemaをローカルXML Schemaとして登録するには、指定されたパス名でリソースを作成するための適切な権限およびアクセス制御リスト(ACL)が必要です。

注意:

通常、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

17.3.8 XML Schemaの削除

プロシージャDBMS_XMLSCHEMA.deleteSchemaを使用すると、登録されたXML Schemaを削除できます。

これにより、次のことが行われます。

  1. 現行のユーザーが、Oracle XML DBリポジトリ内のXML Schemaに対応するリソースを削除するための適切な権限を取得していることが確認されます。XML Schemaのリソースに適切なACLを設定することによって、各ユーザーが削除できるXML Schemaを制御できます。

  2. 削除されるXML Schemaに依存する表がないかどうかが確認されます。そうした表がある場合は、エラーを表示して削除をキャンセルします。この確認は、オプションdelete_invalidateまたはdelete_cascade_forceの使用時には実行されません。その場合は、エラーは発生しません。

  3. Oracle XML DBリポジトリ(フォルダ/sys/schemas)からXML Schema文書を削除します。

  4. XML Schema文書がバイナリXMLインスタンスで使用されるために登録されていて、delete_invalidatedelete_cascade_forceのいずれも使用されない場合を除き、DBA_XML_SCHEMASからXML Schema文書を削除します。

  5. 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から削除します。

関連項目:

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

例17-5DELETE_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;
/

17.3.9 登録されているすべてのXML Schemaのリスト

例では、Oracle XML DBに登録されているすべてのXML Schemaを示します。

例17-6に、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaを使用してOracle XML DBで登録されているすべてのXML Schemaのリストを取得する方法を示します。ビューUSER_XML_SCHEMASALL_XML_SCHEMASUSER_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.

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には、システム生成のオブジェクト識別子が格納されます。

図17-3 XMLType表の作成: CREATE TABLEの構文

図17-3の説明が続きます
「図17-3 XMLType表の作成 – CREATE TABLEの構文」の説明

図17-4 XMLType表の作成: XMLType_tableの構文

図17-4の説明が続きます
「図17-4 XMLType表の作成: XMLType_tableの構文」の説明

図17-5 XMLType表の作成: table_propertiesの構文

図17-5の説明が続きます
「図17-5 XMLType表の作成: table_propertiesの構文」の説明

図17-6 XMLType表の作成: XMLType_virtual_columnsの構文

図17-6の説明が続きます
「図17-6 XMLType表の作成: XMLType_virtual_columnsの構文」の説明

注意:

  • XMLType_virtual_columns句は、バイナリXMLとして格納されているXMLTypeデータに対してのみ使用できます。具体的には、オブジェクト・リレーショナル形式で格納されているデータに対して使用した場合に、パーティショニング句を使用すると、エラーが発生します。

  • XMLデータの場合は、仮想列は主にSQLの制約のパーティション化や定義に使用されます。特定のXMLデータにリレーショナル形式でアクセスするためにそれを投影する必要がある場合、SQL/XML関数XMLTableまたはXMLIndexと構造化コンポーネントの使用を考慮してください。

XPointer表記法のサブセットを使用して、XML Schemaの場所および要素名を含む1つのURLを指定することもできます。 XMLデータの問合せと更新も参照してください。

例17-7は、2つのCREATE TABLE文を示しています。最初の文は、XMLTypepurchaseorder_as_tableを作成します。2番目の文は、XMLTypexml_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";

17.4.1 XML Schemaに基づくデータのXMLType記憶域オプションの指定

XML Schemaを参照するXMLインスタンス・ドキュメントを格納する表を手動で作成する場合、使用する記憶域オプションを指定できます。特定のXMLType記憶域モデルを指定するには、CREATE TABLE文でSTORE AS句を使用します。

それ以外の場合は、XML Schemaの登録時に指定した記憶域モデルが使用されます。登録時に記憶域モデルが指定されなかった場合、オブジェクト・リレーショナル記憶域が使用されます。

XML Schemaに基づくデータの記憶域オプションの指定に加えて、XML Schema注釈を使用して、自動的に作成される表の記憶域オプションを指定することもできます。

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 TABLEALLOW NONSCHEMAとともに使用し、ALLOW ANYSCHEMAとともには使用しない場合、XML Schemaに基づく文書を含むすべての文書が、XML Schemaに基づかないエンコーディングを使用してエンコードされます。後で、同じ表でALTER TABLEALLOW 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の子として定義されており、LineItemsLineItem要素のコレクションであると仮定します。

オブジェクト・リレーショナル記憶域では、コレクションは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を使用して指定した格納方式は、対応するXML Schemaで(非推奨の) XML Schema注釈xdb:storeVarrayAsTable脚注 2を使用して指定した格納方式よりも優先されます。

関連項目:

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コンストラクタに渡すか、またはXMLTypecreateSchemaBasedXML()メソッドを起動します。

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つまたは両方の属性が必要です。

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">

17.5.2 XML Schemaおよび複数の名前空間

XML Schemaに複数の名前空間で定義された要素が含まれるときは、各XML SchemaのschemaLocation属性でエントリを発生させる必要があります。各エントリは、名前空間宣言およびスキーマの場所を示すヒントで構成されています。

また、各エントリは1つ以上の空白文字で区切られています。

主要なXML Schemaでターゲットの名前空間が宣言されていない場合でも、主要なXML Schemaのスキーマの場所を示すヒントを指定するnoNamespaceSchemaLocation属性をXMLインスタンス・ドキュメントに含める必要があります。

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の説明が続きます
「図17-7 Oracle XML DBによるXML Schemaに基づくXMLType表のマッピング方法」の説明


脚注の凡例

脚注1:

XMLSpyは、WebDAVおよびFTPプロトコルもサポートしているため、それを使用して、Oracle XML DBリポジトリに格納されているコンテンツに直接アクセスして編集できます。


脚注2:

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