XML Schema勧告はXML文書のコンテンツおよび構造をXMLで記述するためにWorld Wide Web Consortium (W3C)で作成されました。これには既存のDocument Type Definitions (DTD)をXML Schemaに変換できるように、すべてのDTDの機能が含まれています。XML schemaにはDTDにはない追加機能があります。
この章では、Oracle XML DBでのXML Schemaの使用に関する基本情報を示します。次の操作の実行方法について説明します。
XML Schemaの登録、更新および削除
XML Schemaに基づくデータに対する記憶域構造の作成
XML Schemaデータ型のSQLデータ型へのマッピング
この章の内容は次のとおりです。
関連項目:
|
XML SchemaはXMLで記述されたスキーマ定義言語です。準拠するインスタンス文書の構造とセマンティクスを記述するのに使用できます。たとえば、次のXML Schema定義purchaseOrder.xsd
には、XML発注書の構造とその他のプロパティが記述されています。
このマニュアルで、XML SchemaとはXML Schemaインスタンス定義を指します。
例7-1は、purchaseOrderType
というcomplexType
およびこの型のPurchaseOrder
グローバル要素を宣言するXML Schemaを示しています。これは、例3-9「発注書XML Schema、purchaseOrder.xsd」で使用したXML Schemaに、太字
で示した行を追加したものです。簡略にするため、ここではスキーマの一部(...
の部分)を省略しています。
例7-1 XML SchemaインスタンスpurchaseOrder.xsd
<xs:schema targetNamespace="http://xmlns.oracle.com/xdb/documentation/purchaseOrder" xmlns:po="http://xmlns.oracle.com/xdb/documentation/purchaseOrder" xmlns:xs="http://www.w3.org/2001/XMLSchema" version="1.0"> <xs:element name="PurchaseOrder" type="po:PurchaseOrderType"/> <xs:complexType name="PurchaseOrderType"> <xs:sequence> <xs:element name="Reference" type="po:ReferenceType"/> <xs:element name="Actions" type="po:ActionsType"/> <xs:element name="Reject" type="po:RejectionType" minOccurs="0"/> <xs:element name="Requestor" type="po:RequestorType"/> <xs:element name="User" type="po:UserType"/> <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"/> <xs:element name="Notes" type="po:NotesType"/> </xs:sequence> </xs:complexType> <xs:complexType name="LineItemsType"> <xs:sequence> <xs:element name="LineItem" type="po:LineItemType" maxOccurs="unbounded"/> </xs:sequence> </xs:complexType> ... <xs:simpleType name="DescriptionType"> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:maxLength value="256"/> </xs:restriction> </xs:simpleType> <xs:simpleType name="NotesType"> <xs:restriction base="xs:string"> <xs:minLength value="1"/> <xs:maxLength value="32767"/> </xs:restriction> </xs:simpleType> </xs:schema>
例7-2は、XML Schema purchaseOrder.xsd
に準拠したXML文書を示しています。
例7-2 purchaseOrder.xml: purchaseOrder.xsdに準拠する文書
<po:PurchaseOrder xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:po="http://xmlns.oracle.com/xdb/documentation/purchaseOrder" xsi:schemaLocation= "http://xmlns.oracle.com/xdb/documentation/purchaseOrder http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd"> <Reference>SBELL-2002100912333601PDT</Reference> <Actions> <Action> <User>SVOLLMAN</User> </Action> </Actions> <Reject/> <Requestor>Sarah J. Bell</Requestor> <User>SBELL</User> <CostCenter>S30</CostCenter> <ShippingInstructions> <name>Sarah J. Bell</name> <address>400 Oracle Parkway Redwood Shores CA 94065 USA </address> <telephone>650 506 7400</telephone> </ShippingInstructions> <SpecialInstructions>Air Mail</SpecialInstructions> <LineItems> <LineItem ItemNumber="1"> <Description>A Night to Remember</Description> <Part Id="715515009058" UnitPrice="39.95" Quantity="2"/> </LineItem> <LineItem ItemNumber="2"> <Description>The Unbearable Lightness Of Being</Description> <Part Id="37429140222" UnitPrice="29.95" Quantity="2"/> </LineItem> <LineItem ItemNumber="3"> <Description>Sisters</Description> <Part Id="715515011020" UnitPrice="29.95" Quantity="4"/> </LineItem> </LineItems> <Notes>Section 1.10.32 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC "Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ips ... tiae consequatur, vel illum qui dolorem eum fugiat quo voluptas nulla pariatur?" 1914 translation by H. Rackham "But I must explain to you how all this mistaken idea of denouncing pleasure and praising pain was born and I will give you a c ... o avoids a pain that produces no resultant pleasure?" Section 1.10.33 of "de Finibus Bonorum et Malorum", written by Cicero in 45 BC "At vero eos et accusamus et iusto odio dignissimos ducimus qui blanditiis praesentium voluptatum deleniti atque corrupti quos ... delectus, ut aut reiciendis voluptatibus maiores alias consequatur aut perferendis doloribus asperiores repellat." 1914 translation by H. Rackham "On the other hand, we denounce with righteous indignation and dislike men who are so beguiled and demoralized by the charms of ... secure other greater pleasures, or else he endures pains to avoid worse pains." </Notes> </po:PurchaseOrder>
Oracle XML DBは、厳密な型指定およびその他の強力なXML Schemaのプロパティを使用し、XMLデータベース・データを安全で効率的に処理します。
Oracle XML DBはメタデータとして注釈付きXML Schemaを使用します。標準XML Schema定義は、いくつかのOracle名前空間属性で定義された属性とともに使用されます。これらの属性は、データベースへのXMLインスタンス文書のマッピング方法を決定します。これらの属性は、XML Schemaの名前空間とは異なる名前空間に存在するため、注釈付きXML Schemaは、正当なXML Schema文書になります。
Oracle XML DBをXML Schemaとともに使用する場合、最初にXML Schemaを登録する必要があります。次に、XMLType
表、列およびビューの作成中にXMLスキーマURLを使用できます。XML Schema URLはデータベース内でXML Schemaを識別します。PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
のパラメータSCHEMAURL
と関連付けられています。
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リポジトリに挿入される場合に行う、デフォルト表へのデータの自動挿入。
XMLType
は、データベースの列と表へのXMLデータの格納を容易にする抽象データ型です。XML SchemaはXMLデータのための追加の記憶域とアクセス・オプションを提供します。XML Schemaを使用して、使用するXML要素および属性、要素のネストの種類およびデータ型を定義することができます。
XML Schemaを使用すると、XMLデータがその目的の定義に準拠していることを検証できます。データはその固有の構造を定義するXML Schemaと照合して検証されます。この定義にはデータ型、許容される項目の出現回数および項目の長さが含まれます。FTPやHTTP(S)などのプロトコルを使用して、XML Schemaに基づく文書をOracle XML DBに格納する場合、XML Schemaの情報は文書の挿入の効率を向上させることができます。事前情報なしにXMLインスタンスを処理しなければならない場合、XML Schemaを使用すると、最適な格納、再現性およびアクセスを予測できます。
構造化されていないXMLデータや半構造化されたデータ、バイナリXMLとして格納されることで構造化されたデータの厳密な型指定など、XML Schemaの利点を活用できます。
XMLデータが高度に構造化されている場合は、オブジェクト・リレーショナル形式で格納することをお薦めします。その場合、XML SchemaはXML(Schema)データ型をSQLデータ型およびオブジェクト・リレーショナルな表および列に効率的にマップするために使用されます。
DTDは、XML文書の使用可能な構造を定義する一連の規則です。DTDは、SGMLから書式を導出し、DOCTYPE
要素を使用するか、またはDOCTYPE
参照を介して外部ファイルを使用してXML文書と関連付けることができるテキスト・ファイルです。オブジェクト・リレーショナル記憶域またはバイナリXML記憶域への構造化マッピングを提供するXML Schemaのサポートに加えて、Oracle XML DBでは、XMLインスタンス・ドキュメントでのDTDの指定もサポートされます。DTDはマッピングの導出には使用されませんが、XMLプロセッサからDTDにアクセスし、解析することはできます。
XMLインスタンス・ドキュメントにインラインDTDの定義が含まれる場合、その定義はドキュメントの解析時に使用されます。すべてのDTDの検証およびエンティティ宣言の処理は、この時点で行われます。ただし、解析後、実体参照は実際の値で置換され、元の実体参照は失われます。
Oracle XML DBでXML Schemaを使用するには、XML SchemaをOracle Databaseに登録しておく必要があります。XML Schemaは、PL/SQLパッケージDBMS_XMLSCHEMA
を使用して登録します。
関連項目: 『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』 |
DBMS_XMLSCHEMA
の主なプロシージャは、次のとおりです。
registerSchema
: XML SchemaをOracle Databaseに登録します。
deleteSchema
: 登録済のXML Schemaを削除します。
copyEvolve
: 登録されたXML Schemaを更新します。第10章「XML Schemaの拡張」を参照してください。
プロシージャ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のソース・ドキュメント。この値は、VARCHAR
、CLOB
、BLOB
、BFILE
、XMLType
またはURIType
です。
CSID
: schemaDoc
の値がBFILE
またはBLOB
の場合の、ソース・ドキュメントのエンコーディングのキャラクタ・セットID。
OPTIONS
: XML Schemaの登録方法を指定するオプション。最も重要なオプションは、REGISTER_BINARYXML
であり、バイナリXML記憶域にXML Schemaが使用されることを示します。もうひとつのオプションはREGISTER_NT_AS_IOT
で、これはOCTを索引構成表(IOT)として格納します。
注意: オプションREGISTER_BINARYXML を指定する場合は、パラメータGENTYPES もFALSE に設定する必要があります。 |
関連項目: 『Oracle Database PL/SQLパッケージおよびタイプ・リファレンス』 |
例7-3のコードは、XML Schemaをhttp://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd
というURLに登録します。この例では、データベース・サーバーのローカル・ファイル・システム上のファイルからソース・ドキュメントを読み取るために、BFILE
メカニズムを使用してXML Schemaを登録する方法を示しています。
XML Schemaを登録するとき、スキーマを登録しても、XML Schemaを参照するOracle XML DBリポジトリにすでにロードされているインスタンス文書の状態には影響しないことに注意してください。XML Schemaがまだ登録されていなかったため、そのようなインスタンス・ドキュメントは、ロード時には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
表および列を作成できます。
すべてのDDL操作と同様に、XML Schema登録は、非トランザクション的なものです。しかし、登録は、次の意味において、アトミックです。
登録が正常に終了した場合、操作は自動コミットされます。
登録が失敗した場合、データベースは登録開始前の状態にロールバックされます。
XML Schemaの登録では、オブジェクト型および表が作成される可能性があるため、エラー・リカバリでは作成されたすべての型と表が削除されます。XML Schemaの登録プロセス全体はアトミックであることが保証されます。つまり、正常に終了するか、またはデータベースが登録の開始前の状態に復元されます。
XML Schema文書自体は、XMLType
インスタンスとしてOracle XML DBに格納されます。XML Schema関連のXMLType
型および表は、Oracle XML DBのインストール・スクリプトcatxdbs.sql
の一部として作成されます。
Oracle XML DBのXML Schemaに対するXML Schemaを、ルートXML Schema XDBSchema.xsd
といいます。ルートXML Schemaは、Oracle XML DBで登録できる妥当なXML Schemaを記述しています。Oracle XML DBリポジトリの場所で、/sys/schemas/PUBLIC/xmlns.oracle.com/xdb/XDBSchema.xsd
にあるXDBSchema.xsd
にアクセスできます。
オブジェクト・リレーショナル形式で格納されるXMLデータの場合、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
を起動する前に次のイベントを設定することで、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の登録中の問題を診断するために役立ちます。
XML Schemaがオブジェクト・リレーショナル形式で格納されたXMLデータとともに使用するために登録された場合、パラメータGENTYPES
がTRUE
だと、Oracle XML DBは、準拠XML文書の構造化格納を可能にする適切なSQLオブジェクト型を作成します。デフォルトでは、SQLオブジェクト型はXML Schema登録者のデータベース・スキーマに作成されます。注釈xdb:defaultSchema
が使用されている場合は、Oracle XML DBによって、指定されたデータベース・スキーマを使用してオブジェクト型の作成が試行されます。現行のユーザーがこのオブジェクト型を作成するには、必要な権限を取得している必要があります。
例7-4に、XML Schema purchaseOrder.xsd
がOracle XML DBで登録された場合に自動的に作成されるSQLデータ型を示します。
例7-4 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
注意: デフォルトでは、SQLオブジェクト型および属性の名前はシステム生成されます。例7-4がその例です。XML SchemaにSQLName 属性が含まれていない場合、SQL名はXMLの名前から導出されます。XML Schema注釈を使用すると、ユーザー定義の名前を使用できます(詳細は、「OracleでのXML Schemaの注釈」を参照してください)。 |
デフォルト表は、XMLデータのためのXML Schemaの登録の一部として作成できます。このXML Schemaに準拠する文書が、FTPやHTTP(S)など、表が指定されないAPIおよびプロトコルを介して挿入される場合、デフォルト表が非常に役立ちます。この場合、XMLインスタンスはデフォルト表に挿入されます。
例7-5 グローバル要素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"
属性xdb:defaultTable
に値を指定すると、その名前でXMLType
表が作成されます。それ以外の場合は、内部生成された名前で作成されます。
xdb:tableProps
およびxdb:columnProps
属性を使用して指定されたすべてのテキストが、生成されたCREATE TABLE
文に追加されます。
一般に、XML Schemaの登録時に生成されたSQL構造体は、Oracle XML DB内部にあります。これらをコードで使用しないことをお薦めします。
正確に言うと、生成されたSQLデータ型、ネストされた表、およびに表外の記憶域に関連付けられている表はすべて内部です。これらは、Oracleによっていつでも変更および再定義される、特定のXMLスキーマとオブジェクト・タイプのマッピングに基づいています。
一般的に次が成立します。
生成されたSQLデータ型は使用しないでください。
生成されたネストされた表または表外へのアクセスまたは変更は行わないでください。
ただし、生成された表のパーティション化などの記憶域オプションは変更できます。また、生成された表に対して索引または制約を作成することはできます。また、利便性のために名前が生成された制約など、Oracle XML DBに付属するXML Schema注釈は自由に使用できます。
XML Schemaの登録で生成されたSQL表、オブジェクト、属性の名前は、大/小文字が区別されます。たとえば、例7-3では、XML Schema登録時にPurchaseOrder1669_TAB
という表が自動的に作成されています。この表名は要素名PurchaseOrder
から導出されるため、表の名前も大/小文字が混在しています。このため、SQLコードでこの表を参照する際に識別子に引用符を使用("
PurchaseOrder1669_TAB
"
)する必要があります。使用しないと、ORA-00942: 表またはビューが存在しません
などの、オブジェクトが見つからないというエラーが発生します。
次のデータベース・オブジェクトは、登録されたXML Schemaに依存します。
XML Schemaの要素に準拠するXMLType
列が含まれる表またはビュー。
定義の一部として指定のXML Schemaが含まれるか、またはインポートされるXML Schema。
XML Schemaを参照するカーソル。これには、パッケージDBMS_XMLGEN
のファンクション内部の参照が含まれます。このようなカーソルは、一時オブジェクトです。
例7-6に、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
を使用してOracle XML DBで登録されているすべてのXML Schemaのリストを取得する方法を示します。ビューUSER_XML_SCHEMAS
、ALL_XML_SCHEMAS
、USER_XML_TABLES
およびALL_XML_TABLES
も調べることができます。
例7-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://xmlns.oracle.com/xdb/log/xdblog.xsd XDB NO http://xmlns.oracle.com/xdb/log/ftplog.xsd XDB NO http://xmlns.oracle.com/xdb/log/httplog.xsd XDB NO http://www.w3.org/2001/xml.xsd XDB NO http://xmlns.oracle.com/xdb/XDBFolderListing.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.
プロシージャ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_force
が指定されていて、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パッケージおよびタイプ・リファレンス』 |
例7-7はDELETE_CASCADE_FORCE
の使用方法を示しています。
例7-7 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;
/
バイナリ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を参照しないように変換されていることを確認してください。そうしない場合、消去後にそれらの文書をデコードできなくなります。
表7-1に、XML Schemaを操作する際に役立つXMLType
メソッドを示します。
表7-1 XMLTypeのXML Schema関連メソッド
XMLTypeのメソッド | 説明 |
---|---|
isSchemaBased() |
|
getSchemaURL() |
|
schemaValidate() isSchemaValid() isSchemaValidated() setSchemaValidated() |
第11章「XMLTypeデータの変換および検証」を参照してください。 |
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
にも関連付けられます)。
デフォルトでは、XML SchemaをOracle XML DBに登録すると、登録したユーザーがこのXML Schemaの所有者になります。XML Schema文書への参照は、Oracle XML DBリポジトリに格納されます。このようなXML Schemaは、ローカルとして参照されます。デフォルトでは、これらのスキーマは、所有者であるユーザーのみが使用できます。Oracle XML DBでは、ローカルXML Schemaのリソースは、フォルダ/sys/schemas/
username
に作成されます。残りのリポジトリのパス名は、スキーマのURLから導出されます。
例7-8 ローカル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;
/
ユーザーQUINE
がこのローカルXML Schemaを登録すると、次のパス名が指定されます。
/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を使用して、他のユーザーが所有するXML Schemaを指定できます。 |
ローカル・スキーマとは異なり、権限のあるユーザーは、DBMS_XMLSCHEMA
登録ファンクションで引数を指定することにより、XML SchemaをグローバルXML Schemaとして登録できます。グローバルXML Schemaはすべてのユーザーが参照できます。これはOracle XML DBリポジトリのフォルダ/sys/schemas/PUBLIC/
に格納されます。
注意: フォルダ/sys/schemas/PUBLIC へのアクセスはアクセス制御リスト(ACL)で制御されます。デフォルトでは、このフォルダにはデータベース管理者のみが書込み可能です。グローバルXMLスキーマを登録するには、このフォルダに対する書込み権限が必要です。このフォルダがデフォルトACLによって保護されている場合は、ロールXDBADMIN によってこのディレクトリへの書込み権限も提供されます。第27章「リポジトリのアクセス制御」を参照してください。 |
ローカル・スキーマは、既存のグローバル・スキーマと同じURLに登録できます。ローカル・スキーマは、常に同じ名前(URL)を持つグローバル・スキーマを非表示にします。例7-9に、グローバル・スキーマの登録を示します。
例7-9 グローバル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アクセス)が必要です。
ドキュメント・オブジェクト・モデル(DOM)の再現性とは、DOM検索のために、取得されたXML文書を元のXML文書と同じ構造に保持するという概念です。DOM再現性は、Oracle XML DBに格納されたXML文書の精度および整合性を保証するために必要です。
DOM再現性は、XMLドキュメント内のすべての情報が、無意味な空白を除いて維持されていることを意味します。DOM再現性がある場合、データベースから取得されたXMLデータは、無意味な空白のみを除いて、データベースに挿入される前と同一の情報を持ちます。「DOM再現性」という用語が使用されるのは、この種類の再現性はDOM検索で特に重要だからです。
XMLデータのバイナリXML記憶域では、重要な情報のすべてがバイナリXML形式にエンコードされ、DOM再現性を保証しています。XMLデータの構造化記憶域では、XML Schemaで宣言された要素および属性は、対応するSQLオブジェクト型の個別の属性にマップされます。ただし、XMLインスタンス・ドキュメント内の次の情報は、これらのオブジェクト属性に格納されません。
名前空間宣言
コメント
接頭辞情報
そのかわりに、Oracle XML DBは別の機構を使用してこの情報を追跡し、インスタンス・レベルのメタデータとして記録します。
オブジェクト・リレーショナル形式で格納された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列が存在しない場合、コメント、処理命令などの情報が失われる可能性があるためです。 |
Oracle XML DBリポジトリ内のXML文書をXMLType
インスタンスとして格納できます。これらのインスタンスには、構造化記憶域モデル(オブジェクト・リレーショナル記憶域)、非構造化記憶域モデル(CLOB
)、およびバイナリXML記憶域モデルから任意のモデルを使用できます。これらの文書には、様々な(自然)言語に翻訳しなければならない文字列が含まれている場合があります。通常は、元の文字列とその翻訳を両方ともリポジトリに格納します。ユーザーの言語設定に応じて、これらの文字列を取得および操作できます。
注意: オブジェクト・リレーショナル形式で格納されたXML Schemaは変換できません。 |
この項では、XML Schemaと関連のXMLインスタンス・ドキュメントを変換可能にするためにそれらに加える必要がある変更について説明します。
XML Schema内で、変換する要素ごとに属性xdb:translate
を指定する必要があります。属性xdb:translate
には、次の制限が適用されます。
属性xdb:translate
は、simpleContent
を持つcomplexType
要素にのみ指定できます。ここで、simpleContent
は、string
型の拡張または制限である必要があります。ただし、complexType
要素にxdb:translate
フラグが設定されている場合、その子孫にはこのフラグを設定できません。
属性xdb:translate
は、単一値要素(1つだけの変換を持つ要素)にのみ設定できます。そのような要素の場合、maxoccurs
の値は0
または1
である必要があります。この属性を複数値要素に設定する場合、要素を一意に識別するID
属性を要素が持つ必要があります。
XML Schemaの登録時に、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
は、XML Schemaがこれらの制限を満たしているかを確認します。
次の変換言語属性がサポートされています。
xml:lang
: 変換をサポートするXML Schemaに関連付けられたインスタンス・ドキュメントには、変換言語を指定する必要があります。これは、変換のたびに属性xml:lang
を使用して注釈を付けることで指定できます。属性xml:lang
で使用できる値は、IETF RFC 3066で識別される言語識別子です。
xdb:srclang
: 複数値要素、つまり、複数の変換を持つことができる要素には、1つの変換のみをソース言語変換として使用できます。この変換は、属性xdb:srclang
によって指定されます。これは、セッション言語が指定されていない場合に戻されるデフォルトの変換です。
この項では、変換を指定するXML Schema属性を使用して、サンプル・ドキュメント内の要素を変換可能にします。例7-10は、変換可能でなければならないタイトル文字列を含むドキュメントを定義するXML Schemaを示します。
例7-10 変換の必要があるタイトルを含むドキュメントを定義するXML Schema
<schema xmlns="http://www.w3.org/2001/XMLSchema"
xmlns:xdbsc="http://xmlns.oracle.com/xdb/security.xsd"
xmlns:xdb="http://xmlns.oracle.com/xdb.xsd"
targetNamespace="http://xmlns.oracle.com/xdb/security.xsd"
elementFormDefault="qualified" version="1.0">
<annotation>
<documentation>
This XML schema describes the structure of Security Class documents.
</documentation>
</annotation>
<element name="securityClass" xdb:defaultTable="">
<complexType>
<sequence>
<element name="name" type="string"/>
<element name="title" minOccurs="0" maxOccurs="unbounded"/>
<element name="inherits-from" type="QName" minOccurs="0" maxOccurs="unbounded"/>
<element name="privlist" minOccurs="0" maxOccurs="unbounded">
<complexType>
<choice minOccurs="0" maxOccurs="unbounded">
<element ref="xdbsc:privilege"/>
<element ref="xdbsc:aggregatePrivilege"/>
</choice>
</complexType>
</element>
<!-- this "any" contains all application specific information
for a security class in general e.g. reason for creation -->
<any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="targetNamespace" type="anyURI" use="required"/>
<!-- all privileges in this security class are under this target namespace -->
</complexType>
</element>
<element name="aggregatePrivilege">
<complexType>
<sequence>
<element name="title" minOccurs="0" maxOccurs="unbounded"/>
<sequence maxOccurs="unbounded">
<element name="privilegeRef">
<complexType>
<attribute name="name" type="QName" use="required"/>
</complexType>
</element>
<any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<!-- this "any" contains all application specific information
an aggregate privilege e.g. translations -->
<any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="string" use="required"/>
</complexType>
</element>
<element name="privilege">
<complexType>
<sequence minOccurs="0">
<element name="title" minOccurs="0" maxOccurs="unbounded"/>
<sequence minOccurs="0" maxOccurs="unbounded">
<element name="columnRef">
<complexType>
<attribute name="schema" type="string" use="required"/>
<attribute name="table" type="string" use="required"/>
<attribute name="column" type="string" use="required"/>
</complexType>
</element>
<any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<!-- this "any" contains all application specific information
for a privilege e.g. translations -->
<any namespace="##other" minOccurs="0" maxOccurs="unbounded"/>
</sequence>
<attribute name="name" type="string" use="required"/>
</complexType>
</element>
</schema>
例7-11は、例7-10のXML Schemaに関連付けられるドキュメントを示します。
例7-11 変換されていないインスタンス・ドキュメント
<securityClass xmlns="http://xmlns.oracle.com/xdb/security.xsd" xmlns:is="xmlns.oracle.com/iStore" xmlns:oa="xmlns.oracle.com/OracleApps" targetNamespace="xmlns.oracle.com/example"> <name> securityClassExample </name> <title> Security Class Example </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> <privlist> <privilege name="privilege1"/> <aggregatePrivilege name="iStorePOApprover"> <title> iStore Purchase Order Approver </title> <privilegeRef name="is:privilege1"/> <privilegeRef name="oa:submitPO"/> <privilegeRef name="oa:privilege3"/> </aggregatePrivilege> <privilege name="privilege2"> <title> secondary privilege </title> <columnRef schema="APPS" table="PurchaseOrder" column="POId"/> <columnRef schema="APPS" table="PurchaseOrder" column="Amount"/> </privilege> </privlist> </securityClass>
最上位のタイトルを変換可能にするには、xdb:translate
をtrue
に設定します。これは、単一値要素(xdb:maxOccurs
が1
)です。例7-12は、属性xdb:translate
がtrue
に設定されている新規のXML Schemaを示します。
例7-12 単一値要素の属性xdb:translateを含むXML Schema
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xdbsc="http://xmlns.oracle.com/xdb/security.xsd" xmlns:xdb="http://xmlns.oracle.com/xdb.xsd" targetNamespace="http://xmlns.oracle.com/xdb/security.xsd" elementFormDefault="qualified" version="1.0"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:import namespace-"http://xmlns.oracle.com/xdb" schemaLocation="http://xmlns.oracle.com/xdb/xmltr.xsd"/> <annotation> <documentation> This XML schema describes the structure of Security Class documents. </documentation> </annotation> <element name="securityClass" xdb:defaultTable=""> <complexType> <sequence> <element name="name" type="string"/> <element ref="titleref" minOccurs="0" maxOccurs="unbounded" xdb:maxOccurs="1" xdb:translate="true"/> <element name="inherits-from" type="QName" minOccurs="0" maxOccurs="unbounded"/> <element name="privlist" minOccurs="0" maxOccurs="unbounded" xdb:maxOccurs="1"> <complexType> <choice minOccurs="0" maxOccurs="unbounded"> <element ref="xdbsc:privilege"/> <element ref="xdbsc:aggregatePrivilege"/> </choice> </complexType> </element> <!-- this "any" contains all application specific information for a security class in general e.g. reason for creation --> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="targetNamespace" type="anyURI" use="required"/> <!-- all privileges in this security class are under this target namespace --> </complexType> </element> <element name="aggregatePrivilege"> <complexType> <sequence> <element name="title" minOccurs="0" maxOccurs="unbounded"/> <sequence maxOccurs="unbounded"> <element name="privilegeRef"> <complexType> <attribute name="name" type="QName" use="required"/> </complexType> </element> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <!-- this "any" contains all application specific information an aggregate privilege e.g. translations --> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="name" type="string" use="required"/> </complexType> </element> <element name="privilege"> <complexType> <sequence minOccurs="0"> <element name="title" minOccurs="0" maxOccurs="unbounded"/> <sequence minOccurs="0" maxOccurs="unbounded"> <element name="columnRef"> <complexType> <attribute name="schema" type="string" use="required"/> <attribute name="table" type="string" use="required"/> <attribute name="column" type="string" use="required"/> </complexType> </element> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <!-- this "any" contains all application specific information for a privilege e.g. translations --> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="name" type="string" use="required"/> </complexType> </element> <element name="titleref"> <complexType> <simpleContent> <extension base="xs:string"> <attribute ref="xml:lang"/> <attribute ref="xdb:srclang"/> </extension> </simpleContent> </complexType> </element> </schema>
例7-13は、タイトル・テキストを変換した後のインスタンス・ドキュメントを示します。
例7-13 変換後のドキュメント
<securityClass xmlns="http://xmlns.oracle.com/xdb/security.xsd" xmlns:is="xmlns.oracle.com/iStore" xmlns:oa="xmlns.oracle.com/OracleApps"> <name> securityClassExample </name> <title xml:lang="en" xdb:srclang="true"> Security Class Example </title> <title xml:lang="es"> Security Class Example - Spanish </title> <title xml:lang="fr"> Security Class Example - French </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> <privlist> <privilege name="privilege1"/> <aggregatePrivilege name="iStorePOApprover"> <title> iStore Purchase Order Approver </title> <privilegeRef name="is:privilege1"/> <privilegeRef name="oa:submitPO"/> <privilegeRef name="oa:privilege3"/> </aggregatePrivilege> <privilege name="privilege2"> <title> secondary privilege </title> <columnRef schema="APPS" table="PurchaseOrder" column="POId"/> <columnRef schema="APPS" table="PurchaseOrder" column="Amount"/> </privilege> </privlist> </securityClass>
複数値要素の場合にタイトルを変換可能にするには、xdb:maxOccurs
をunbounded
に設定します。ただし、xdb:translate
は、各要素を一意に識別する識別子属性がないかぎり、複数値要素用にtrue
に設定できません。例7-14は、title
要素に識別子属性id
を使用するXML Schemaを示します。
例7-14 複数値要素の属性xdb:translateを含むXML Schema
<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:xdbsc="http://xmlns.oracle.com/xdb/security.xsd" xmlns:xdb="http://xmlns.oracle.com/xdb.xsd" targetNamespace="http://xmlns.oracle.com/xdb/security.xsd" elementFormDefault="qualified" version="1.0"> <xs:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="http://www.w3.org/2001/xml.xsd"/> <xs:import namespace-"http://xmlns.oracle.com/xdb" schemaLocation="http://xmlns.oracle.com/xdb/xmltr.xsd"/> <annotation> <documentation> This XML schema describes the structure of Security Class documents. </documentation> </annotation> <element name="securityClass" xdb:defaultTable=""> <complexType> <sequence> <element name="name" type="string"/> <element name="title" minOccurs="0" maxOccurs="unbounded" xdb:maxOccurs="1"/> <element name="inherits-from" type="QName" minOccurs="0" maxOccurs="unbounded"/> <element name="privlist" minOccurs="0" maxOccurs="unbounded" xdb:maxOccurs="1"> <complexType> <choice minOccurs="0" maxOccurs="unbounded"> <element ref="xdbsc:privilege"/> <element ref="xdbsc:aggregatePrivilege"/> </choice> </complexType> </element> <!-- this "any" contains all application specific information for a security class in general e.g. reason for creation --> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="targetNamespace" type="anyURI" use="required"/> <!-- all privileges in this security class are under this target namespace --> </complexType> </element> <element name="aggregatePrivilege"> <complexType> <sequence> <element name="titleref" minOccurs="0" maxOccurs="unbounded" xdb:maxoccurs="unbounded" xdb:translate="true"/> <sequence maxOccurs="unbounded"> <element name="privilegeRef"> <complexType> <attribute name="name" type="QName" use="required"/> </complexType> </element> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <!-- this "any" contains all application specific information an aggregate privilege e.g. translations --> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="name" type="string" use="required"/> </complexType> </element> <element name="privilege"> <complexType> <sequence minOccurs="0"> <element name="titleref" minOccurs="0" maxOccurs="unbounded" xdb:maxoccurs="unbounded" xdb:translate="true"/> <sequence minOccurs="0" maxOccurs="unbounded"> <element name="columnRef"> <complexType> <attribute name="schema" type="string" use="required"/> <attribute name="table" type="string" use="required"/> <attribute name="column" type="string" use="required"/> </complexType> </element> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <!-- this "any" contains all application specific information for a privilege e.g. translations --> <any namespace="##other" minOccurs="0" maxOccurs="unbounded"/> </sequence> <attribute name="name" type="string" use="required"/> </complexType> </element> <element name="titleref"> <complexType> <simpleContent> <extension base="xs:string"> <attribute ref="xml:lang"/> <attribute ref="xdb:srclang"/> <attribute name="id" type="integer"/> </extension> </simpleContent> </complexType> </element> </schema>
例7-15は、例7-14のXML Schemaに関連付けられたドキュメントを示します。
例7-15 複数値要素を持つXML Schemaの変換済ドキュメント
<securityClass xmlns="http://xmlns.oracle.com/xdb/security.xsd" xmlns:is="xmlns.oracle.com/iStore" xmlns:oa="xmlns.oracle.com/OracleApps"> <name> securityClassExample </name> <title> Security Class Example </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> <privlist> <privilege name="privilege1"/> <aggregatePrivilege name="iStorePOApprover"> <title> iStore Purchase Order Approver </title> <privilegeRef name="is:privilege1"/> <privilegeRef name="oa:submitPO"/> <privilegeRef name="oa:privilege3"/> </aggregatePrivilege> <privilege name="privilege2"> <title id="2" xml:lang="en" xdb:srclang="true"> secondary privilege - english </title> <title id="1" xml:lang="fr"> primary privilege - french </title> <title id="1" xml:lang="en" xdb:srclang="true"> primary privilege - english </title> <columnRef schema="APPS" table="PurchaseOrder" column="POId"/> <columnRef schema="APPS" table="PurchaseOrder" column="Amount"/> </privilege> </privlist> </securityClass>
変換済のドキュメントに対しては、次の操作を実行できます。
挿入: 変換をサポートするXML Schemaにドキュメントが準拠する場合は、それをOracle XML DBに挿入できます。変換を含むドキュメントに対しては、言語情報を提供するか、セッション言語変換を使用できます。
ドキュメントに言語情報が含まれず、属性xml:lang
が設定されていない場合、変換にはセッション言語が使用されます。例7-16は、セッション言語が日本語のドキュメントを表します。属性xml:lang
はsession language
に設定され、属性xdb:srclang
はtrue
に設定されています。
例7-16 言語情報のないドキュメントの挿入
<securityClass xmlns="http://xmlns.oracle.com/xdb/security.xsd" xmlns:is="xmlns.oracle.com/iStore" xmlns:oa="xmlns.oracle.com/OracleApps" targetNamespace="xmlns.oracle.com/example"> <name> securityClassExample </name> <title> Security Class Example </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> </securityClass>
例7-17は、Oracle XML DBに挿入された後のドキュメントを示します。
例7-17 リポジトリに挿入された後のドキュメント
<securityClass xmlns="http://xmlns.oracle.com/xdb/security.xsd" xmlns:is="xmlns.oracle.com/iStore" xmlns:oa="xmlns.oracle.com/OracleApps" targetNamespace="xmlns.oracle.com/example"> <name> securityClassExample </name> <title xml:lang="jp" xdb:srclang="true"> Security Class Example </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> </securityClass>
言語情報を提供すると、明示的に言語をxdb:srclang=true
とマークするか、属性xdb:srclang
の中のセッション言語を使用して、属性xml:lang
が設定されます。いずれも行わないと、任意の変換が選択され、xdb:srclang
がtrue
に設定されます。
例7-18は、セッション言語が日本語のドキュメントを表します。
例7-18 言語情報を持つドキュメントの挿入
<securityClass xmlns="http://xmlns.oracle.com/xdb/security.xsd" xmlns:is="xmlns.oracle.com/iStore" xmlns:oa="xmlns.oracle.com/OracleApps" targetNamespace="xmlns.oracle.com/example"> <name> securityClassExample </name> <title xml:lang="en"> Security Class Example </title> <title xml:lang="fr"> Security Class Example - FR </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> </securityClass>
例7-19は、Oracle XML DBに挿入された後のドキュメントを示します。
例7-19 挿入後のドキュメント
<securityClass xmlns="http://xmlns.oracle.com/xdb/security.xsd" xmlns:is="xmlns.oracle.com/iStore" xmlns:oa="xmlns.oracle.com/OracleApps" targetNamespace="xmlns.oracle.com/example"> <name> securityClassExample </name> <title xml:lang="en" xdb:srclang="true"> Security Class Example </title> <title xml:lang="fr"> Security Class Example - FR </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> </securityClass>
問合せ: 変換された要素を伴うノードを問い合せる場合、問合せは変換のデフォルト動作を表示します。問合せの結果に変換のデフォルト動作が適用されるように指定するには、Oracle Xpath関数ora:translate
を使用する必要があります。関数の構文は次のとおりです。
Nodeset ora:translate(Nodeset parent, String childname, String childnsp)
パラメータparent
は、変換済ノードを検索する先の親ノードです。childname
は子ノード名で、childnsp
は子ノードのネームスペースのURLです。
関数ora:translate
は、親ノードの名前が指定した子ノードの名前と一致する場合に正の整数を戻し、xml:lang
の値は、セッション言語またはxdb:srclang
がtrue
の言語と同じです。
XMLQuery
などのSQL関数が変換済のドキュメントに適用されると、セッション言語変換が存在する場合はそれが戻され、存在しない場合はソース言語変換が戻されます。たとえば、次の問合せは、セッション言語変換を戻します。
SELECT XMLQuery('$x/ora:translate(securityClass, "title")' PASSING x.OBJECT_VALUE AS "x" RETURNING CONTENT) FROM some_table x;
問合せの出力結果は次のとおりです。
<title xml:lang="fr"> Security Class Example - FR </title>
特定の言語で結果を取得するには、その言語をXPath式の中で指定します。
SELECT XMLQuery('$x/securityClass/title[@xml:lang="en"]' PASSING x.OBJECT_VALUE AS "x" RETURNING CONTENT) FROM some_table x;
問合せの出力結果は次のとおりです。
<title xml:lang="en" xdb:srclang="true"> Security Class Example </title>
変換済のドキュメントは、テキスト(CLOB
)またはバイナリXMLでのみ格納できるため、機能上の評価およびファンクション索引XMLIndex
、またはCONTEXT
索引を使用した問合せのみが可能です。XMLIndex
索引とCONTEXT
索引の問合せすべてに対して、ドキュメントにセッション言語変換が存在する場合はそれが戻され、存在しない場合はソース言語変換が戻されます。ただし、ファンクション索引を使用した問合せの場合は、索引を使用するすべての言語について、明示的なxml:lang
述語を持つ索引を作成する必要があります。
XMLSerialize
やXDBURIType
などのSQL関数を使用して完全なドキュメントを取得する場合は、セッション言語変換に一致する変換のみが戻されます。プロトコルに対しては、言語のプリファレンスを設定でき、ドキュメントはその言語でのみ戻されます。
次のPL/SQLプロシージャおよび関数は、XML変換をサポートします。
DBMS_XMLTRANSLATIONS.translateXML
: ドキュメントを指定した言語に変換します。指定した言語変換が存在する場合はそれが戻され、存在しない場合はソース言語変換が戻されます。
たとえば、translateXML(doc, 'fr')
と記述して例7-19の変換言語にフランス語を指定する場合、次のコードが戻され、他の変換はすべて無視されます。
securityClass xmlns="http://xmlns.oracle.com/xdb/security.xsd" xmlns:is="xmlns.oracle.com/iStore" xmlns:oa="xmlns.oracle.com/OracleApps" targetNamespace="xmlns.oracle.com/example"> <name> securityClassExample </name> <title xml:lang="fr"> Security Class Example - FR </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> </securityClass>
DBMS_XMLTRANSLATIONS.enableTranslation
、DBMS_XMLTRANSLATIONS.disableTranslation
: セッション・レベルで変換の有効化/無効化を行います。問合せは、変換が無効な場合は主ドキュメントに作用し、有効な場合は変換済ドキュメントに作用します。
DBMS_XMLTRANSLATIONS.getBaseDocument
: すべての変換とともに完全なドキュメントを戻します。
更新: Oracle SQL関数updateXML
を使用して変換済のノードを更新します。ただし、変換言語を指定せずに変換済ノードを更新しようとした場合、エラーが発生します。次のPL/SQLプロシージャは、変換済のドキュメントへの更新操作をサポートします。
DBMS_XMLTRANSLATIONS.updateTranslation
: この関数は、指定したxpath
にある変換を特定の言語で更新します。特定の言語での変換が存在しない場合は、それが挿入されます。
DBMS_XMLTRANSLATIONS.setSourceLang
: このプロシージャは、指定したxpathにあるソース言語を指定した言語に設定します。
Oracle XML DBを使用すると、登録されたXML Schemaによって定義されたグローバル要素に限定したXMLType
表および列を作成できます。XMLType
列を特定の要素および特定のXML Schemaに制限すると、以降はその要素のスキーマ定義に準拠している文書のみを含めることができます。XMLType
表の列は、CREATE TABLE
操作に適切なXMLSCHEMA
およびELEMENT
句を追加することで、特定の要素およびXML Schemaに制限されます。
図7-1から図7-4に、XMLType
表を作成するための構文を示します。
関連項目: object_propertiesのような構文要素を含むCREATE TABLE の詳しい説明は、『Oracle Database SQL言語リファレンス』。 |
注意: 各自のデータベース・スキーマと異なるデータベース・スキーマにXMLType 表を作成するには、権限CREATE ANY TABLE だけでなく、権限CREATE ANY INDEX も必要です。これは、表の作成時に列OBJECT_ID に一意索引が作成されるためです。列OBJECT_ID には、システム生成のオブジェクト識別子が格納されます。 |
注意: XMLデータの場合は、仮想列は主にSQLの制約のパーティション化や定義に使用されます。特定のXMLデータにリレーショナル形式でアクセスするためにそれを投影する必要がある場合、SQL/XML関数XMLTable またはXMLIndex と構造化コンポーネントの使用を考慮してください。関連項目:
|
XPointer表記法のサブセットを使用して、XML Schemaの場所および要素名を含む1つのURLを指定することもできます。第4章「XMLTypeの操作」も参照してください。
例7-20は、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
要素に限定されます。
例7-20 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";
XMLSchema
およびElement
を指定するには、次の2つの方法があります。
XMLSchema
およびElement
を別の句として指定する方法
XPointer表記法でElement
句のみを使用する方法
XML Schemaに制限されるXMLType
表または列に関連付けられているデータは、数種類の異なる方法で格納できます。
分割してオブジェクト・リレーショナル形式(構造化記憶域)で格納
単一のCLOB
列(非構造化記憶域)を使用してテキストとして格納
単一のXML列を使用してバイナリXML形式で格納(バイナリXML記憶域)
XML Schemaを参照するXMLインスタンス・ドキュメントを格納する表を手動で作成する場合、使用する記憶域オプションを指定できます。特定のXMLType
記憶域モデルを指定するには、CREATE TABLE
文でSTORE AS
句を使用します。それ以外の場合は、XML Schemaの登録時に指定した記憶域モデルが使用されます。登録時に記憶域モデルが指定されなかった場合、オブジェクト・リレーショナル記憶域が使用されます。
この項では、XML Schemaに基づくデータのための記憶域オプションを指定する際に必要な知識について説明します。また、XML Schema注釈を使用して、自動的に作成された表に記憶域オプションを指定することもできます。
STORE AS BINARY_XML
を指定すると、バイナリXML記憶域が使用されます。XML文書が準拠する必要があるXML Schemaを指定する場合、バイナリXMLとして格納されるXMLType
表および列を作成するためだけに、そのXML Schemaを使用できます。同じXML Schemaを使用して、オブジェクト・リレーショナル形式あるいはCLOB
インスタンスとして格納されるXMLType
表および列を作成することはできません。
逆も成り立ちます。登録されたXML Schemaに対してバイナリXML以外の記憶域モデルを使用する場合、そのXML Schemaを使用して作成できるのは、オブジェクト・リレーショナル形式で、またはCLOB
インスタンスとして格納されない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 NONSCHEMA
オプションを使用すると、XML Schemaに基づくエンコーディングを使用する表や列に対して、スキーマに基づかない文書も受け入れることができるように指定できます。キーワードXMLSCHEMA
がない場合、エンコーディングはスキーマに基づかない文書に対して行われます。キーワードALLOW NONSCHEMA
はないが、キーワードXMLSCHEMA
がある場合、エンコーディングは、指定された単一のXML Schemaに対して行われます。キーワードALLOW NONSCHEMA
はないが、キーワードALLOW ANYSCHEMA
がある場合、エンコーディングは、参照されているあらゆるXML Schemaに対して行われます。
XML文書を、文書に対応しないXMLType
表または列に挿入しようとすると、エラーが発生します。
可能なオプションについて表7-2にまとめます。
表7-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に基づくエンコーディングを使用してエンコードされます。 |
非構造化記憶域を指定するには、表作成時にSTORE AS CLOB
を使用します。この場合、すべてのXML文書が単一のCLOB
列に格納されます。
例7-21は、XMLType
表およびXMLType
列を持つ表の作成方法を示しています。ここで、XMLType
のコンテンツは、登録済のXML Schemaによって定義されたグローバル要素に限定され、XMLType
のコンテンツは単一のCLOB
列を使用して格納されます。
例7-21 XML Schemaに基づくXMLType表および列に対するCLOB記憶域の指定
CREATE TABLE purchaseorder_as_table OF XMLType XMLTYPE STORE AS CLOB 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 STORE AS CLOB XMLSCHEMA "http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd" ELEMENT "PurchaseOrder";
STORE AS CLOB
句にLOB記憶域パラメータを追加できます。
構造化記憶域では、コレクションはSQL VARRAY値にマップされます。XML コレクションは、maxOccurs
> 1であるすべての要素で、複数回出現できます。このようなVARRAYのコンテンツ全体は、デフォルトでOrdered Collection Table(OCT)内に一連の行として格納されます。
例7-22で、追加の記憶オプションの指定について説明します。LineItem
コレクションのVARRAYは、表ではなくLOBとして格納されます。USERS
は、要素Notes
の格納に使用される表領域です。表は、オンライン・トランザクション処理(OLTP)のために圧縮されます。
例7-22 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;
注意: Oracle Database 11gR2より前のリリースでは、CREATE TABLE のデフォルトの動作は、表としてではなく、LOBとして格納されたVARRAYを使用してコレクションを格納していました。 |
注意: 親のXMLType 表または列に圧縮を指定する場合、すべての子孫XMLType Ordered Collection Tables(OCT)も同様に圧縮されます。 |
関連項目:
|
XMLType
表または列のすべてのVARRAYをLOBまたは表として格納するように指定する必要がある場合は、便利な方法として、構文のSTORE ALL VARRAYS AS
句の後に、LOBS
またはTABLES
をそれぞれ使用できます。これは、コレクションごとに複数のVARRAY
...STORE AS
句を使用する方法の代替策となる便利な方法です。例7-23に、これを示します。
例7-23 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;
STORE ALL VARRAYS AS
を使用して指定した格納方式は、対応するXML Schemaでxdb:storeVarrayAsTable
を使用して指定した格納方式よりも優先されます。
関連項目:
|
構造化記憶域を使用してXMLデータを格納する場合は、XML文書内で1回のみ出現する要素および属性に対して、標準的なリレーショナル制約を指定できます。例7-22に、表の作成時にオブジェクト・リレーショナル表記法を使用して一意制約と外部キー制約を定義する方法を示します。
非構造化記憶域を使用するXMLType
表および列には、制約を定義できません。
XML Schemaに注釈を付けることによって、XML Schema登録処理によって生成されるオブジェクトおよび表に影響を与えることができます。これを行うには、Oracle特有の属性を、XML Schemaによって宣言されるcomplexType
、element
およびattribute
の定義に追加します。
Oracle XML DBによって使用される大部分のXML属性は、名前空間http://xmlns.oracle.com/xdb
に属します。XMLデータをバイナリXML形式でエンコードするために使用されるXML属性は、名前空間http://xmlns.oracle.com/2004/CSX
に属します。XML Schemaの注釈の処理を単純化するために、名前空間接頭辞はXML Schemaのルート要素で宣言することをお薦めします。
XML Schemaに注釈を付ける一般的な理由は、次のとおりです。
XMLデータの構造化記憶域に対してPL/SQLプロシージャDBMS_XMLSCHEMA.registerSchema
で作成された表やオブジェクト、オブジェクト属性の名前が、わかりやすくすべてのアプリケーション・ネーミング標準に準拠することを保証するため。この場合は、パラメータGENTYPES
またはGENTABLES
をTRUE
に設定します。
XML Schemaとデータベース内の既存のオブジェクトおよび表との間をマップするため。この場合は、パラメータGENTYPES
またはGENTABLES
をFALSE
に設定します。
SQLで直接作業する場合、引用符で囲まれた識別子を使用する必要のある、大/小文字の混在する名前が生成されないようにします。
文書が相互に関連する再帰的なXPath問合せの場合に、構造化記憶域のXPathリライトを可能にします。これは、再帰的なXMLデータをターゲットとしているXPath式の引数を使用する、SQL/XMLアクセスおよび問合せ関数の特定の用途に適用されます。
最も一般的に使用されるXML Schema注釈は、次のとおりです。
xdb:defaultTable
: GENTABLES
パラメータがTRUE
の場合に、各グローバル要素に生成されるデフォルトの表の名前。この注釈を空の文字列""
に設定すると、該当する要素にデフォルトの表が生成されなくなります。
xdb:SQLType
: complexType
定義の場合、対応するオブジェクト・タイプ。simpleType
定義では、XML Schemaデータ型とSQLデータ型間のデフォルト・マッピングをオーバーライドするためにSQLType
を使用します。SQLType
は、無制限の文字列をVARCHAR(4000) CHAR
値(デフォルト)ではなく、CLOB
値として格納する必要がある場合に定義するのが、一般的な使用方法です。注意: データ型NCHAR
、NVARCHAR
、またはNCLOB
は、SQLType
注釈の値としては使用できません。
xdb:maintainDOM
- 指定されているcomplexType
定義のDOM再現性を維持する必要があるかどうかを判断するために使用します。
xdb:storeVarrayAsTable
- XML Schemaのルート要素を指定します。すべてのコレクションをOrdered Collection Table(OCT)として格納するために使用します。maxOccurs > 1
で指定されている各要素に対して、1つのOCTが作成されます。OCTは、システム生成の名前で作成されます。storeVarrayAsTable
のデフォルト値はtrue
です。
これらの属性のいずれにも、値を指定する必要はありません。Oracle XML DBにより、デフォルトで、XML Schemaの登録プロセス中に適切な値が提供されます。ただし、構造化記憶域を使用する場合、少なくとも最上位のSQL型の名前を指定し、後で参照できるようにすることをお薦めします。
例7-24は、例7-1のXML Schemaのリストの一部であり、最も重要ないくつかのOracle XML DB注釈が含まれるように修正を加えています。
例7-24 一般的なスキーマ注釈の使用
<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" xdb:storeVarrayAsTable="true"> <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:schema>
schema
要素にはxdb
名前空間の宣言が含まれます。これには注釈xdb:storeVarrayAsTable = "true"
(デフォルト値)も含まれます。これによりXML Schema内のすべてのコレクションがOrdered Collection Table(OCT)を使用して管理されるようになります。
グローバル要素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再現性を保持する必要がないことを指定します。
例7-25は、注釈付きXML Schemaの登録で作成された表およびオブジェクトの一部を示しています。
例7-25 注釈付き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.
次に、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)が作成されました。
表7-3、表7-4および表7-5に要素および属性の宣言で指定できるOracle XML DBの注釈を示します。接頭辞csx
があるもの以外のすべての注釈は、構造化記憶域に対して登録されたXML Schemaに適用できます。これには、オブジェクト・リレーショナル形式で格納されるハイブリッド記憶域の一部が含まれます。
次の注釈は、非構造化記憶域に対して登録されたXML Schemaに適用されます。
xdb:defaultTable
xdb:defaultTableSchema
次の注釈は、バイナリXML記憶域に対して登録されたXML Schemaに適用されます。
xdb:defaultTable
xdb:defaultTableSchema
xdb:tableProps
表7-3 要素内の注釈
属性 | 値 | デフォルト | 説明 |
---|---|---|---|
任意の列STORAGE句 |
|
デフォルトの |
|
表の名前 |
要素名に基づきます。 |
このXML SchemaのXMLインスタンスを格納する必要があるSQL表の名前を指定します。これは、表の名前が指定されていないAPIおよびプロトコル(FTP、HTTP(S)など)を使用してXMLを挿入する場合に最も有効です。構造化記憶域およびバイナリXML記憶域に適用されます。 |
|
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
|
|
|
|
|
|
|
|
|
任意の正の整数 |
1 |
要素が出現できる回数の最大値を指定します。値が |
|
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
|
任意のSQLコレクション型 |
要素名から生成された名前 |
このXML要素に対応するSQLコレクション型の名前。XML要素は、 |
|
|
|
|
|
SQL識別子 |
要素名 |
このXML要素にマップされるSQLオブジェクト内での属性の名前。 |
|
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
|
任意のSQLデータ型脚注 1 。ただしNCHAR、 |
要素名から生成された名前 |
このXML要素の宣言に対応するSQL型の名前。 |
|
|
TRUE |
|
|
任意の表STORAGE句 |
|
デフォルトの |
|
|
|
|
脚注1 「XML Schemaデータ型のSQLデータ型へのマッピング」を参照してください。
表7-4 グローバルなcomplexType要素を宣言する要素内の注釈
属性 | 値 | デフォルト | 説明 |
---|---|---|---|
|
|
|
|
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
|
任意のSQLデータ型脚注 1 。ただしNCHAR、 |
要素名から生成された名前 |
このXML要素の宣言に対応するSQL型の名前。 |
脚注1 「XML Schemaデータ型のSQLデータ型へのマッピング」を参照してください。
表7-5 XML Schema宣言内の注釈
属性 | 値 | デフォルト | 説明 |
---|---|---|---|
|
|
|
|
|
|
|
関連項目: xdb:maxOccurs 、xdb:translate およびxdb:srclang の詳細は、「変換のためのXML SchemaとXMLインスタンス・ドキュメントの変更」を参照してください。 |
オブジェクト・リレーショナル形式で格納されるXMLType
データ(構造化記憶域)では、パフォーマンスを最適化するために注意深い計画が求められます。エンティティ関連モデル、索引付け、データ型、表パーティションなどの通常のリレーショナル・データについても、同様の点を考慮することが求められます。
XPathリライトを有効にし、最適なパフォーマンスを達成するには、XML Schema注釈を使用してこのような多くの設計選択を実装します。この項では、オブジェクト・リレーショナル形式で格納されるXMLType
データの使用を最適化するための注釈のガイドラインについて説明します。
XML Schema登録では、XML Schemaで定義される最上位の要素ごとに、デフォルトで、最上位の表が作成されます。そのような要素の中には、XML Schemaに準拠するXMLインスタンスの最上位要素として使用されるものもあります。それ以外の要素は使用されません。これは、たとえば、REF
ターゲットとして使用するために最上位にするXML Schemaの要素に共通です。
対応するXMLインスタンスの最上位でXML Schemaの最上位の要素が使用されない場合は、注釈xdb:defaultTable =
""
をXML Schemaの要素に追加することで、関連する不要な表を作成せずに済みます。この属性の空の値により、デフォルト表の作成を回避できます。
チューニング用に、対象の問合せの実行計画の出力を検証します。この出力は、オブジェクト・リレーショナル形式で格納されているXMLType
データの基礎となる表を参照します。これらの表には、システム生成された名前がデフォルトで含まれます。対象とする表の場合は特に、独自の表名を指定することをお薦めします。これを行うには、注釈xdb:defaultTable
を使用します。
XML Schemaの登録では、DOM再現性が維持されるように、XMLデータを格納する表がデフォルトで生成されます。多くの場合、これはデータ中心のXMLデータのDOM再現性が必要でない場合です。かわりに、DOM再現性を維持しないオブジェクト・リレーショナル表を使用することで、格納、問合せおよびデータ変更のパフォーマンスを改善できます。これを行うには、注釈xdb:maintainDOM = "
false
"
を使用します。
コレクション要素間の順序が重要でない場合は、注釈xdb:maintainOrder = "
false
"
を使用します。これにより、XPathリライトの最適化が可能になり、一般的に問合せの実行効率が向上します。
アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、xs:time
型およびxs:dateTime
型のXMLSschema要素に、xdb:SQLType = "
TIMESTAMP WITH TIME ZONE
"
の注釈を指定します。これによって、タイムゾーン・インジケータが含まれている値の格納、取出しおよび比較を実行できます。
XMLデータの基礎となる表または列に、パーティションや表領域、圧縮句などの追加のプロパティが必要な場合は、注釈xdb:tableProps
またはxdb:columnProps
を使用し、それらの注釈を指定します。これにより、主キーまたは制約を追加できます。たとえば、オンライン・トランザクション処理(OLTP)のために表の圧縮を行うには、tableProps
属性を使用してCOMPRESS FOR OLTP
を追加します。
complexType
によって定義された要素と属性の総数が1000に達すると、その型のインスタンスがデータベースに格納される場合、生成されるSQLオブジェクトを管理できる単一の表を作成することはできません。大規模コレクションがある場合は、1つの表でこのような1000列の上限にぶつかる可能性があります。
注釈xdb:defaultTable
およびxdb:SQLInline
を使用すると、このようなコレクション要素を表外に格納するように指定できます。つまり、これらのデータは個別の表に格納され、主となるコレクション表に格納されるのは、その表の行の参照のみです。表外の表の名前を指定するには、xdb:defaultTable
を使用します。表外に格納するには、大規模コレクションの各要素に注釈xdb:SQLInline = "
false
"
を指定します。
登録済のXML Schemaのバージョンには、Oracle XML DB注釈の完全なセットが含まれています。例7-8および例7-9に示されているように、登録されているXML Schemaの場所は、XML Schemaがローカル・スキーマかグローバル・スキーマかによって異なります。
ユーザーが指定した注釈、またはスキーマの登録処理で追加された注釈の値に対して、登録されているXML Schemaの問合せが可能です。例7-26は、XMLデータの構造化記憶域に対してXML Schemaで宣言されているグローバルなcomplexType
定義、およびそれに対応するSQLオブジェクト型とDOM再現性値を示しています。
例7-26 登録された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データの型は、XML Schemaデータ型により決まります。このXMLデータがOracle XML DBに格納される場合、その記憶域データ型はデフォルトのマッピングを使用して(およびオプションで、XML Schema注釈を使用して指定したマッピング情報を使用して)、XML Schemaデータ型から導かれます。
記憶域に対して使用するデータ型を指定しない場合、Oracle XML DBは登録時に、デフォルトのマッピングを使用して適切にXML Schemaに注釈を付けます。こうすると、登録されたXML Schemaに、データ型注釈の完全なセットが含まれます。
非構造化記憶域では、データ型マッピングは重要ではありません。XMLデータはすべて、単一CLOB
として一緒に格納されます。
構造化記憶域では、XML Schemaデータ型がSQLデータ型にマップされます。
バイナリXML記憶域では、XML Schemaデータ型はOracle XML DBバイナリXMLエンコーディング型にマップされます。
図7-5に、Oracle XML DBで、XML文書およびXML Schemaに指定されたマッピングを使用して、XML Schemaに基づくXMLType
表を作成する方法を示します。XML Schemaで指定された格納方式に応じて、XMLインスタンス・ドキュメントは、バイナリXML形式またはCLOB
値として単一のXMLType
列に格納されるか、複数のオブジェクト・リレーショナル列を使用して格納されます。
図7-5 Oracle XML DBによるXML Schemaに基づくXMLType表のマッピング方法
この項では、PL/SQLパッケージDBMS_XMLSCHEMA
を使用して、XML Schema属性および要素のデータ型をSQLデータ型にマップする方法について説明します。
注意: XML Schema登録時に、XML Schemaデータ型からマップされるSQLデータ型に直接アクセスしないでください。これらのSQL型はOracle XML DBの実装の一部です。ユーザーが使用できるように公開されたものではありません。オラクル社は製品パッチなどで、実装をいつでも変更する権利を留保します。オラクル社によるそうした変更は、XMLの抽象的概念に従うアプリケーションには影響しませんが、それらのデータ型に直接アクセスするアプリケーションには影響を与えることがあります。 |
例7-27に、XML Schemaデータ型をSQLデータ型にマッピングする単純な例を示します。属性SQLType
を使用してデータ型のマッピングを指定します。また、属性SQLName
を使用して、様々なXML要素および属性に使用されるオブジェクト属性を指定します。
例7-27 属性SQLTypeを使用したXML Schemaデータ型のSQLデータ型へのマッピング
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:xdb="http://xmlns.oracle.com/xdb" version="1.0" xdb:storeVarrayAsTable="true"> <xs:element name="PurchaseOrder" type="PurchaseOrderType" xdb:defaultTable="PURCHASEORDER"/> <xs:complexType name="PurchaseOrderType" xdb:SQLType="PURCHASEORDER_T"> <xs:sequence> <xs:element name="Reference" type="ReferenceType" minOccurs="1" xdb:SQLName="REFERENCE"/> <xs:element name="Actions" type="ActionsType" xdb:SQLName="ACTIONS"/> <xs:element name="Reject" type="RejectionType" minOccurs="0" xdb:SQLName="REJECTION"/> <xs:element name="Requestor" type="RequestorType" xdb:SQLName="REQUESTOR"/> <xs:element name="User" type="UserType" minOccurs="1" xdb:SQLName="USERID"/> <xs:element name="CostCenter" type="CostCenterType" xdb:SQLName="COST_CENTER"/> <xs:element name="ShippingInstructions" type="ShippingInstructionsType" xdb:SQLName="SHIPPING_INSTRUCTIONS"/> <xs:element name="SpecialInstructions" type="SpecialInstructionsType" xdb:SQLName="SPECIAL_INSTRUCTIONS"/> <xs:element name="LineItems" type="LineItemsType" xdb:SQLName="LINEITEMS"/> <xs:element name="Notes" type="po:NotesType" xdb:SQLType="CLOB"/> </xs:sequence> </xs:complexType> <xs:complexType name="LineItemsType" xdb:SQLType="LINEITEMS_T"> <xs:sequence> <xs:element name="LineItem" type="LineItemType" maxOccurs="unbounded" xdb:SQLName="LINEITEM" xdb:SQLCollType="LINEITEM_V"/> </xs:sequence> </xs:complexType> <xs:complexType name="LineItemType" xdb:SQLType="LINEITEM_T"> <xs:sequence> <xs:element name="Description" type="DescriptionType" xdb:SQLName="DESCRIPTION"/> <xs:element name="Part" type="PartType" xdb:SQLName="PART"/> </xs:sequence> <xs:attribute name="ItemNumber" type="xs:integer" xdb:SQLName="ITEMNUMBER" xdb:SQLType="NUMBER"/> </xs:complexType> <xs:complexType name="PartType" xdb:SQLType="PART_T"> <xs:attribute name="Id" xdb:SQLName="PART_NUMBER" xdb:SQLType="VARCHAR2"> <xs:simpleType> <xs:restriction base="xs:string"> <xs:minLength value="10"/> <xs:maxLength value="14"/> </xs:restriction> </xs:simpleType> </xs:attribute> <xs:attribute name="Quantity" type="moneyType" xdb:SQLName="QUANTITY"/> <xs:attribute name="UnitPrice" type="quantityType" xdb:SQLName="UNITPRICE"/> </xs:complexType> ... <xs:complexType name="ActionsType" xdb:SQLType="ACTIONS_T"> <xs:sequence> <xs:element name="Action" maxOccurs="4" xdb:SQLName="ACTION" xdb:SQLCollType="ACTION_V"> <xs:complexType xdb:SQLType="ACTION_T"> <xs:sequence> <xs:element name="User" type="UserType" xdb:SQLName="ACTIONED_BY"/> <xs:element name="Date" type="DateType" minOccurs="0" xdb:SQLName="DATE_ACTIONED"/> </xs:sequence> </xs:complexType> </xs:element> </xs:sequence> </xs:complexType> <xs:complexType name="RejectionType" xdb:SQLType="REJECTION_T"> <xs:all> <xs:element name="User" type="UserType" minOccurs="0" xdb:SQLName="REJECTED_BY"/> <xs:element name="Date" type="DateType" minOccurs="0" xdb:SQLName="DATE_REJECTED"/> <xs:element name="Comments" type="CommentsType" minOccurs="0" xdb:SQLName="REASON_REJECTED"/> </xs:all> </xs:complexType> <xs:complexType name="ShippingInstructionsType" xdb:SQLType="SHIPPING_INSTRUCTIONS_T"> <xs:sequence> <xs:element name="name" type="NameType" minOccurs="0" xdb:SQLName="SHIP_TO_NAME"/> <xs:element name="address" type="AddressType" minOccurs="0" xdb:SQLName="SHIP_TO_ADDRESS"/> <xs:element name="telephone" type="TelephoneType" minOccurs="0" xdb:SQLName="SHIP_TO_PHONE"/> </xs:sequence> </xs:complexType> ... </xs:schema>
属性の宣言では、次のいずれかを使用してXML Schemaデータ型を指定できます。
基本型
このXML Schemaまたは外部のXML Schema内で宣言されたグローバルなsimpleType
このXML Schemaまたは外部のXML Schema内で宣言されたグローバル属性に対する参照(ref=".."
)
ローカルなsimpleType
SQLデータ型および関連付けられた情報(長さおよび精度)、メモリーのマッピングの情報は、属性の基礎となるsimpleType
から導出されます。
入力XML Schema文書にSQLType
の値を明示的に指定できます。この場合、指定するデータ型はスキーマ検証で使用されます。これによって、次の特定の形式のオーバーライドが可能になります。
デフォルトのSQLデータ型がSTRING
の場合、CHAR
、VARCHAR
またはCLOB
でオーバーライドできます。
デフォルトのSQLデータ型がRAW
の場合は、RAW
またはBLOB
でオーバーライドできます。
要素の宣言では、次のいずれかを使用してXML Schemaデータ型を指定できます。
属性の宣言に対して型を指定する方法のいずれか。「XML Schema属性データ型のSQLへのマッピング」を参照してください。
このXML Schema文書または外部のXML Schema内で指定されたグローバルなcomplexType
このXML Schema文書または外部のXML Schema内に存在するグローバル要素(ref="..."
)
ローカルなcomplexType
デフォルトでは、complexType
に基づく要素は、各サブ要素および属性に対応するオブジェクト属性が含まれるSQLオブジェクト型にマップされます。入力XML SchemaにSQLType
属性を明示的に指定することによって、このマッピングをオーバーライドできます。この場合、SQLType
に対して次の値が使用できます。
VARCHAR2
RAW
CLOB
BLOB
これらの値によって、格納されたXMLデータはデータベース内でテキスト形式で表されます。
たとえば、SQLType
をVARCHAR2
からCLOB
にオーバーライドするには、xmlns:xdb="http://xmlns.oracle.com/xdb"
を使用してからxdb:SQLType = "CLOB"
を使用してxdb
名前空間を宣言します。
特別な場合の処理を次に示します。
要素の宣言に使用されるcomplexType
値、およびcomplexType
内で宣言された要素の処理中に循環が検出された場合、SQLInline
属性は強制的にfalse
に設定され、正しいSQLマッピングはREF
XMLTYPE
に設定されます。
maxOccurs > 1
の場合は、VARRAY型を作成できます。
SQLInline
="true"
の場合は、要素型が事前にSQL型に決定しているVARRAY型が作成されます。VARRAYのカーディナリティは、属性maxOccurs
の値に基づきます。属性SQLCollType
を使用してVARRAY型の名前をユーザーが指定するか、そうしない場合は要素名から導出されます。
SQLInline = "false"
の場合、SQLデータ型はXDB.XDB$XMLTYPE_REF_LIST_T
に設定されます。これは、XMLType
インスタンスを参照するREF
値の配列を表す事前に定義されたデータ型です。
要素がグローバル要素の場合、またはSQLInline = "false"
の場合は、デフォルト表が作成されます。デフォルト表の名前をユーザーが指定するか、そうしない場合は要素名から導出されます。
この項では、XML Schema定義によってXML Schema simpleType
をSQLオブジェクト型にマップする方法について説明します。図7-6に、この例を示します。
図7-6 simpleTypeのマッピング: XML文字列からSQLのVARCHAR2またはCLOB
表7-6から表7-9までに、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
)データ型にマップされます。
表7-6 SQLへのXML Schema文字列データ型のマッピング
XML Schema文字列型 | lengthまたはmaxLengthファセット | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|---|
|
n |
|
|
|
- |
|
|
表7-7 SQLへのXML Schemaバイナリ・データ型(hexBinary/base64Binary)のマッピング
XML Schemaバイナリ型 | lengthまたはmaxLengthファセット | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|---|
|
n |
|
|
|
- |
|
|
表7-8 SQLへのXML Schema数値基本型のデフォルトのマッピング
XML Schema simpleType | デフォルトSQLデータ型 | 指定されたtotalDigits (m)、fractionDigits(n) | 互換性のあるSQLデータ型 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表7-9 XML Schema日時データ型のSQLへのマッピング
XML Schema日時型 | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
表7-10 SQLへのその他のXML Schema基本および派生データ型のデフォルトのマッピング
XML Schema基本および派生型 | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
|
|
なし |
|
|
なし |
Oracle XML DBでは、NCHAR
、NVARCHAR
およびNCLOB
は、属性SQLType
の値としてサポートされません。XML要素または属性の型にNCHAR
、NVARCHAR
またはNCLOB
を指定できません。また、ユーザー独自のデータ型を提供する場合は、これらのデータ型を使用しないでください。
XML Schemaで、XML Schemaデータ型が、maxLength
が4000未満の文字列に指定されている場合、このデータ型は、指定された長さのVARCHAR2
オブジェクト属性にマップされます。ただし、XML SchemaにmaxLength
が指定されていない場合は、LOBのみにマップできます。これは、ほとんどの文字列の値が小さく、LOBを必要とする値がわずかである場合は、あまり効率的ではありません。
次のXML Schemaデータ型では、オプションのタイムゾーン・インジケータをリテラル値の一部として使用できます。
xsd:dateTime
xsd:time
xsd:date
xsd:gYear
xsd:gMonth
xsd:gDay
xsd:gYearMonth
xsd:gMonthDay
デフォルトの場合、XML Schema登録では、xsd:dateTime
とxsd:time
はSQLデータ型TIMESTAMP
にマップされ、他のすべてのデータ型はSQLデータ型DATE
にマップされます。SQLデータ型TIMESTAMP
とDATE
には、タイムゾーン・インジケータを使用できません。
アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、属性SQLType
を使用して、SQL型をTIMESTAMP WITH TIME ZONE
に指定してください。これによって、タイムゾーン・インジケータが含まれている値の適切な格納および取出しを実行できます。次に例を示します。
<element name="dob" type="xsd:dateTime" xdb:SQLType="TIMESTAMP WITH TIME ZONE"/> <attribute name="endofquarter" type="xsd:gMonthDay" xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
XML Schemaを使用すると、次のようにcomplexType
がSQLオブジェクト型にマップされます。
complexType
内で宣言されたXML属性は、SQLオブジェクト属性にマップされます。XML属性を定義するsimpleType
によって、対応するオブジェクト属性のSQLデータ型が決定されます。
complexType
内で宣言されたXML要素も、SQLオブジェクト属性にマップされます。XML要素を定義するsimpleType
またはcomplexType
によって、対応するオブジェクト属性のSQLデータ型が決定されます。
属性maxOccurs
> 1でXML要素が宣言されると、そのXML要素はSQLのcollection(オブジェクト)属性にマップされます。collectionは、VARRAY値(デフォルト、推奨)または順序付けられていない表(属性xdb:maintainOrder
がfalse
に設定されている場合)になります。VARRAY値のデフォルトの記憶域はOrdered Collection Table(OCT)です。属性xdb:storeVarrayAsTable
をfalse
に設定することによって、かわりにLOB記憶域を選択できます。
グローバルなcomplexType
に基づく要素が存在する場合は、complexType
宣言にSQLType
およびSQLSchema
属性の両方を指定する必要があります。また、要素の宣言内に同じSQLType
およびSQLSchema
属性を必要に応じて含めることもできます。
グローバルな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>