XML Schema勧告は、XML文書のコンテンツおよび構造をXMLで記述するためにWorld Wide Web Consortium(W3C)で作成されました。XML Schemaには、既存のDocument Type Definition(DTD)をXML Schemaに変換できるように、すべてのDTD機能が含まれています。また、XML SchemaにはDTDにはない追加機能があります。
この章では、Oracle XML DBでのXML Schemaを使用に関する基本情報を示します。次の操作の実行方法について説明します。
XML Schemaの登録、更新および削除
XML Schemaに基づくデータに対する記憶域構造の作成
XML Schemaデータ型のSQLデータ型およびバイナリXMLエンコーディング型へのマップ
この章の内容は次のとおりです。
関連項目:
|
XML Schemaは、XMLで記述されたスキーマ定義言語です。準拠するインスタンス・ドキュメントの構造およびその他の様々なセマンティクスを定義するために使用できます。たとえば、次のXML Schema定義purchaseOrder.xsd
には、発注書のXML文書に関する構造およびその他のプロパティが記述されています。
このマニュアルで、XML SchemaとはXML Schemaインスタンス定義を指します。
例6-1 XML SchemaインスタンスpurchaseOrder.xsd
次のXML Schemaでは、purchaseOrderType
というcomplexType
およびこの型のPurchaseOrder
グローバル要素を宣言しています。これは、例3-7「発注書XML Schema、purchaseOrder.xsd」で使用したXML Schemaに、太字
で示した行を追加したものです。簡略にするため、ここではスキーマの一部(...
で示した部分)を省略しています。
<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>
例6-2 purchaseOrder.xml: purchaseOrder.xsdに準拠する文書
次の例は、XML Schema purchaseOrder.xsd
に準拠したXML文書を示しています。
<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 DBで定義された属性とともに使用されます。これらの属性は、データベースへのXMLインスタンス文書のマッピング方法を決定します。これらの属性は、XML Schemaの名前空間とは異なる名前空間に存在するため、注釈付きXML Schemaは、正当なXML Schema文書になります。
Oracle XML DBをXML Schemaとともに使用する場合は、最初にXML Schemaを登録する必要があります。この登録によって、XMLType
表、列およびビューの作成に、XML Schema 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)などのプロトコルを使用してOracle XML DBにXML Schemaベースの文書を格納する場合、XML Schema情報があると文書挿入の効率を改善できることがあります。事前情報のないXMLインスタンスを処理する必要がある場合は、XML Schemaを使用すると、最適な格納、再現性およびアクセスを予測できます。
XMLデータが高度に構造化されている場合は、オブジェクト・リレーショナル形式で格納することをお薦めします。その場合、XML SchemaはXML(Schema)データ型をSQLデータ型およびオブジェクト・リレーショナルな表および列に効率的にマップするために使用されます。データをバイナリXML形式で格納することにより、非構造化または半構造化されたXMLデータで、構造化データと同様に、厳密な型指定などのXML Schemaの長所を活用できます。
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を更新します。第9章「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サーバーへのアクセスを試行しません。
SCHEMADOC
: XML Schemaのソース・ドキュメント。この値は、VARCHAR
、CLOB
、BLOB
、BFILE
、XMLType
またはURIType
です。
CSID
: schemaDoc
の値がBFILE
またはBLOB
の場合の、ソース・ドキュメントのエンコーディングのキャラクタ・セットID。
OPTIONS
: スキーマの登録方法を指定するオプション。最も重要なオプションは、REGISTER_BINARYXML
であり、バイナリXML記憶域にXML Schemaが使用されることを示します。他のオプションには、REGISTER_AUTO_OOL
やREGISTER_NT_AS_IOT
などがあります。
注意: オプションREGISTER_BINARYXML を指定する場合は、パラメータGENTYPES もFALSE に設定する必要があります。 |
例6-3 DBMS_XMLSCHEMA.REGISTERSCHEMAを使用したXML Schemaの登録
次のコードは、XML Schemaをhttp://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd
というURLに登録します。この例では、データベース・サーバーのローカル・ファイル・システム上のファイルからソース・ドキュメントを読み取るために、BFILE
メカニズムを使用してXML Schemaを登録する方法を示しています。
BEGIN DBMS_XMLSCHEMA.registerSchema( SCHEMAURL => 'http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd', SCHEMADOC => bfilename('XMLDIR','purchaseOrder.xsd'), CSID => nls_charset_id('AL32UTF8')); END; /
XML Schemaの登録時には、スキーマを登録しても、XML Schemaを参照しているOracle XML DBリポジトリにロード済のインスタンス・ドキュメントのステータスに影響はありません。XML Schemaがまだ登録されていなかったため、そのようなインスタンス・ドキュメントは、ロード時にはXML Schemaに基づいていませんでした。スキーマが登録された後も、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
の一部として作成されます。
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データの場合、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登録者のデータベース・スキーマに作成されます。defaultSchema
注釈が使用されている場合は、Oracle XML DBによって、指定されたデータベース・スキーマを使用してオブジェクト型の作成が試行されます。現行のユーザーがこのオブジェクト型を作成するには、必要な権限を取得している必要があります。
例6-4に、XML Schema purchaseOrder.xsd
がOracle XML DBで登録された場合に自動的に作成されるSQLデータ型を示します。
例6-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オブジェクト型および属性の名前はシステム生成されます。例6-4がその例です。XML SchemaにSQLName 属性が含まれていない場合、SQL名はXMLの名前から導出されます。XML Schema注釈を使用すると、ユーザー定義の名前を使用できます(詳細は、「OracleでのXML Schemaの注釈」を参照してください)。 |
デフォルト表は、XMLデータのためのXML Schemaの登録の一部として作成できます。このXML Schemaに準拠する文書が、FTPやHTTP(S)など、表が指定されないAPIおよびプロトコルを介して挿入される場合、デフォルト表が非常に役立ちます。この場合、XMLインスタンスはデフォルト表に挿入されます。
例6-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"
属性defaultTable
に値を指定すると、その名前でXMLType
表が作成されます。それ以外の場合は、内部生成された名前で作成されます。
tableProps
およびcolumnProps
属性を使用して指定されたすべてのテキストが、生成されたCREATE TABLE
文に追加されます。
XML Schema登録で生成されたSQL表、オブジェクトおよび属性の名前は、大/小文字が区別されます。たとえば、例6-3では、XML Schema登録時にPurchaseOrder1669_TAB
という表が自動的に作成されています。この表名は要素名PurchaseOrder
から導出されるため、表の名前も大/小文字が混在しています。これは、SQLコードでこの表を参照する際に識別子に引用符を使用("
PurchaseOrder1669_TAB
"
)する必要があることを意味します。引用符を使用しない場合、「ORA-00942: 表またはビューが存在しません。」のように、オブジェクトを検出できないことに起因するエラーが発生します。
次のデータベース・オブジェクトは、登録されたXML Schemaに依存します。
XML Schemaの要素に準拠するXMLType
列が含まれる表またはビュー。
定義の一部として指定のXML Schemaが含まれるか、またはインポートされるXML Schema。
XML Schemaを参照するカーソル。これには、パッケージDBMS_XMLGEN
のファンクション内部の参照が含まれます。このようなカーソルは、一時オブジェクトです。
例6-6に、DBMS_XMLSCHEMA.registerSchema
を使用してOracle XML DBで登録されているすべてのXML Schemaのリストを取得する方法を示します。USER_XML_SCHEMAS
、ALL_XML_SCHEMAS
、USER_XML_TABLES
およびALL_XML_TABLES
も調べることができます。
例6-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
: 依存関係が検知されてもエラーを表示しません。そのかわり、各依存関係に無効のマークを付けます。バイナリXMLで使用するXML Schemaが登録されている場合は、DBA_XMLSCHEMAS
からXML Schemaを削除しません。
DELETE_CASCADE
: XML Schema登録時に生成されたすべての型とデフォルト表を削除します。デフォルト表以外の表に格納されているXML Schemaに依存するインスタンスがある場合は、エラーを表示します。ただし、ANY_SCHEMA
を使用して作成されたXMLType
列に格納されているインスタンスについては、そのような場合もエラーを表示しません。バイナリXMLで使用するXML Schemaが登録されている場合は、DBA_XMLSCHEMAS
からXML Schemaを削除しません。
DELETE_CASCADE_FORCE
: XML Schema登録時に生成されたすべての型とデフォルト表を削除します。デフォルト表以外の表に格納されているXML Schemaに依存するインスタンスがある場合は、エラーを表示しません。そのかわり、各依存関係に無効のマークを付けます。XML SchemaをDBA_XMLSCHEMAS
から削除します。
関連項目: 『Oracle Database PL/SQLパッケージ・プロシージャおよびタイプ・リファレンス』 |
例6-7はDELETE_CASCADE_FORCE
の使用方法を示しています。
例6-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_XMLSCHEMAS
からは削除されません。その結果、そのXML Schemaを使用して新しいXMLインスタンス・ドキュメントをエンコードすることはできませんが、Oracle XML DBでそのXML Schemaを参照しているすべての既存のドキュメントは、その後もそのXML Schemaを使用してデコードできます。
この状況は、DBMS_XMLSCHEMA.
purgeSchema
を使用してDBA_XMLSCHEMAS
からXML Schemaを削除するまで続きます。一般的には、delete_restrict
またはdelete_cascade
を使用することをお薦めします。そのXML Schemaが完全に不要であると確信している場合、DELETE_CASCADE_FORCE
でなく、DBMS_XMLSCHEMA.purgeSchema
をコールしてください。
プロシージャpurgeSchema
はOracle XML DBから(特に、DBA_XMLSCHEMAS
から)XML Schemaを完全に削除します。DBMS_XMLSCHEMA.purgeSchema
を使用する前に、消去されるXML Schemaを参照している既存のすべてのXML文書が、別のXML Schemaを参照するか、XML Schemaを参照しないように変換されていることを確認してください。そうしない場合、消去後にそれらの文書をデコードできなくなります。
表6-1に、XML Schemaを操作する際に役立つXMLType
メソッドを示します。
表6-1 XMLTypeのXML Schema関連メソッド
XMLTypeのメソッド | 説明 |
---|---|
isSchemaBased() |
|
getSchemaURL() getRootElement() getNamespace() |
|
schemaValidate() isSchemaValid() isSchemaValidated() setSchemaValidated() |
第10章「XMLTypeデータの変換および検証」を参照してください。 |
XML Schemaは、ローカルまたはグローバルとして登録できます。
ローカルなXML Schemaは、デフォルトでは所有者のみが参照できます。
グローバルなXML Schemaは、デフォルトではすべてのデータベース・ユーザーが参照および使用できます。
XML Schemaを登録する場合、PL/SQLパッケージDBMS_XMLSCHEMA
はOracle XML DBリポジトリに対応するリソースを追加します。XML Schema URLによってリポジトリのXML Schemaリソースのパス名が決定されます(さらに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から導出されます。
例6-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)で制御されます。デフォルトでは、このフォルダにはデータベース管理者のみが書込み可能です。グローバル・スキーマを登録するには、このフォルダに対する書込み権限が必要です。このフォルダがデフォルトACLによって保護されている場合は、ロールXDBADMIN によってこのディレクトリへの書込み権限も提供されます。第27章「アクセス制御リストおよびセキュリティ・クラス」を参照してください。 |
ローカル・スキーマは、既存のグローバル・スキーマと同じURLに登録できます。ローカル・スキーマは、常に同じ名前(URL)を持つグローバル・スキーマを非表示にします。
例6-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の内部でのみ使用する属性です。この列に直接アクセスしたり、操作しないでください。
他の属性に格納できない情報はすべて、この位置指定ディスクリプタ属性によって格納されます。Oracle XML DBに格納されたすべてのXML文書のDOM再現性を保証するために、PD情報が使用されます。このような情報には、たとえば注文情報、コメント、処理命令、名前空間の接頭辞などがあります。
DOM再現性が不要な場合は、型レベルでmaintainDOM = "false"
属性を設定し、XML Schema定義でSYS_XDBPD$
を省略できます。
注意: このマニュアルの多くの例では、簡略化のためSYS_XDBPD$ 属性を省略しています。ただし、この属性は、XML Schemaの登録処理によって生成されたすべてのSQLオブジェクト型に、位置指定ディスクリプタ(PD)列として常に存在します。
通常は、PD属性を省略しないことをお薦めします。PD列が存在しない場合、コメント、処理命令などの情報が失われる可能性があるためです。 |
Oracle XML DBリポジトリ内のセキュリティ・オブジェクトをXMLType
インスタンスとして格納できます。これらのインスタンスには、構造化記憶域モデル(オブジェクト・リレーショナル記憶域)、非構造化記憶域モデル(CLOB
)、およびバイナリXML記憶域モデルから任意のモデルを使用できます。これらのセキュリティ・オブジェクトには、様々な言語で検索または表示が可能な、変換が必要な文字列も含まれています。これらの文字列を変換したものは、元のドキュメントと関連付ける必要があるため、Oracle XML DBリポジトリに元の文字列とともに格納されています。ユーザーの言語設定に応じて、これらの文字列を取得および操作できます。
注意: オブジェクト・リレーショナル形式で格納された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の登録時に、プロシージャregisterSchema
はXML Schemaが前述の制限を満たすかどうかをチェックします。
次の変換言語属性がサポートされています。
xml:lang
: 変換をサポートするXML Schemaに関連付けられたインスタンス・ドキュメントには、変換言語を指定する必要があります。これは、変換のたびに属性xml:lang
を使用して注釈を付けることで指定できます。属性xml:lang
で使用できる値は、IETF RFC 3066で識別される言語識別子です。
xdb:srclang
: 複数値要素、つまり、複数の変換を持つことができる要素には、1つの変換のみをソース言語変換として使用できます。この変換は、属性xdb:srclang
によって指定されます。これは、セッション言語が指定されていない場合に戻されるデフォルトの変換です。
この項では、変換を指定するXML Schema属性を使用して、サンプル・ドキュメント内の要素を変換可能にします。例6-10は、セキュリティ・クラスのドキュメントを定義するXML Schemaを示します。
例6-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>
例6-11は、例6-10のXML Schemaに関連付けられるセキュリティ・クラス・ドキュメントを示しています。
例6-11 XML Schemaに関連付けられるセキュリティ・クラス・ドキュメント
<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
であるため、単一値要素です。例6-12は、属性xdb:translate
がtrue
に設定されている新規のXML Schemaを表しています。
例6-12 単一値要素用に属性xdb:translateがTRUEに設定された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>
例6-13は、変換後のセキュリティ・クラス・ドキュメントを示します。
例6-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="ja" 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
に設定できません。例6-14は、識別子属性id
がtitle
要素に対して設定されている新規のスキーマを説明しています。
例6-14複数値要素用に属性xdb:translateがTRUEに設定された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>
例6-15は、例6-14のXML Schemaに関連付けられたセキュリティ・クラス・ドキュメントを示しています。
例6-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="ja" xdb:srclang="true"> secondary privilege - english </title> <title id="1" xml:lang="fr"> primary privilege - french </title> <title id="1" xml:lang="ja" 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
が設定されていない場合、変換にはセッション言語が使用されます。例6-16は、セッション言語が日本語のセキュリティ・クラス・ドキュメントを表しています。属性xml:lang
はsession language
に設定され、属性xdb:srclang
はtrue
に設定されています。
例6-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>
例6-17は、Oracle XML DBに挿入後のセキュリティ・クラス・ドキュメントを示します。
例6-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
に設定されます。
例6-18は、セッション言語が日本語のセキュリティ・クラス・ドキュメントを表しています。
例6-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="ja"> Security Class Example </title> <title xml:lang="fr"> Security Class Example - FR </title> <inherits-from>is:iStorePurchaseOrder</inherits-from> </securityClass>
例6-19は、Oracle XML DBに挿入後のセキュリティ・クラス・ドキュメントを示します。
例6-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="ja" 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 translate(Nodeset parent, String childname, String childnsp)
関数ora:translate
は、親ノードの名前が指定した子ノードの名前と一致する場合に正の整数を戻し、xml:lang
の値は、セッション言語またはxdb:srclang
がtrue
の言語と同じです。この構文の説明の中で、parent
は検索対象の変換されたノードが含まれる親ノード、childname
は子ノードの名前、childnsp
は子ノードの名前空間URLを示します。
extract
およびextractValue
のようなSQL関数が変換済のドキュメントに適用されると、セッション言語変換が存在する場合はそれが戻され、存在しない場合はソース言語変換が戻されます。たとえば、関数extract
を使用する次の問合せは、セッション言語変換を戻します。
SELECT extract(value(x), 'ora:translate(/securityClass, "title"), 'xmlns:ora="http://xmlns.oracle.com/xdb"') FROM some_table x;
問合せの出力結果は次のとおりです。
<title xml:lang="fr"> Security Class Example - FR </title>
特定の言語で結果を取得するには、その言語をXPath式の中で指定します。
SELECT EXTRACT(value(x), '/securityClass/title[@xml:lang="ja"]') FROM some_table x;
問合せの出力結果は次のとおりです。
<title xml:lang="ja" xdb:srclang="true"> Security Class Example </title>
変換済のドキュメントは、テキスト(CLOB
)またはバイナリXMLでのみ格納できるため、機能上の評価およびファンクション索引XMLIndex
、またはCONTEXT
索引を使用した問合せのみが可能です。XMLIndex
索引とCONTEXT
索引の問合せすべてに対して、ドキュメントにセッション言語変換が存在する場合はそれが戻され、存在しない場合はソース言語変換が戻されます。ただし、ファンクション索引を使用した問合せの場合は、索引を使用するすべての言語について、明示的なxml:lang
述語を持つ索引を作成する必要があります。
getCLOBVal
、getStringVal
、およびXDBURIType
のようなSQL関数を使用して完全なドキュメントを取得する場合は、セッション言語変換に一致する変換のみが戻されます。プロトコルに対しては、言語のプリファレンスを設定でき、ドキュメントはその言語でのみ戻されます。
次のPL/SQLプロシージャおよび関数は、XML変換をサポートします。
DBMS_XMLTRANSLATIONS.translateXML
: ドキュメントを指定した言語に変換します。指定した言語変換が存在する場合はそれが戻され、存在しない場合はソース言語変換が戻されます。
たとえば、TRANSLATEXML (doc,'fr')
と記述して例6-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
: すべての変換とともに完全なドキュメントを戻します。
更新: 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に制限されます。
図6-1に、XMLType
表を作成するための構文を示します。
関連項目: CREATE TABLE の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。 |
例6-20に示すXPointer表記法のサブセットを使用して、XML Schemaの場所および要素名を含む1つのURLを指定することもできます。第4章「XMLTypeの操作」も参照してください。
例6-20 XML Schemaに基づくXMLType表および列の作成
この例は、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
要素に限定されます。
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インスタンス・ドキュメントを格納する表を作成する場合、使用する記憶域オプションを指定できます。デフォルトの記憶域モデルは、構造化記憶域です。構造化記憶域でなくバイナリXML記憶域または非構造化記憶域を使用するには、CREATE TABLE
文でSTORE AS
句を使用します。
この項では、XML Schemaに基づくデータのための記憶域オプションを指定する際に必要な知識について説明します。
バイナリXML記憶域を指定するには、表作成時にSTORE AS BINARY_XML
を使用します。その場合、XMLドキュメントが準拠する必要があるXML Schemaを指定すると、そのXML Schemaを使用して作成できるのは、バイナリXML形式で格納されるXMLType
の表と列だけです。同一のXML Schemaを使用して、オブジェクト・リレーショナル形式またはCLOB
インスタンスとして格納されるXMLType
表と列を作成することはできません。
逆も成り立ちます。登録されたXML Schemaに対してバイナリXML以外の記憶域モデルを使用する場合、そのXML Schemaを使用して作成できるのは、オブジェクト・リレーショナル形式で、またはCLOB
インスタンスとして格納されないXMLType
表および列だけです。
バイナリXML記憶域は、特にXML Schemaの使用に関して、XMLデータを非常に柔軟に取り扱うことができます。バイナリXMLは、エンコーディングでXML Schemaが使用されるかどうかによって、異なる方式でXMLデータをエンコードします。異なったXML Schemaを使用すると同一のデータを異なる方式でエンコードできます。
バイナリXMLデータのエンコーディングでXML Schemaを考慮すると、XML Schemaデータ型が、格納の際にエンコードされる型にマップされます。別の方法として、XML Schemaを参照するかどうかに関係なく、スキーマに基づかないバイナリXMLとしてXMLデータをエンコードすることもできます。その場合、参照されているXML Schemaは無視され、XML Schemaデータ型のエンコーディングはありません。
XMLType
表または列を作成する場合、バイナリXML記憶域を指定すると、XML Schemaを利用するために、列または表をエンコードする方法を指定することができます。選択肢は3つあります。
列または表のデータをスキーマに基づかないバイナリXMLとしてエンコードします。その場合でも列に格納するXMLデータをXML Schemaに準拠させることはできますが、その必要はありません。エンコーディングの目的では、参照されているXML Schemaはすべて無視されます。文書は、挿入または更新時に自動的に検証されません。
その場合でも、スキーマに基づかないバイナリXMLとしてエンコードされた、XML Schemaに基づく文書を明示的に検証することができます。これは、文書を変更または削除する可能性があるため、特定のXML Schemaにあまり密接に結び付けたくない場合という、重要なユースケースを表しています。
単一のXML Schemaに準拠するように列または表のデータをエンコードします。すべての行(文書)が同一のXML Schemaに準拠する必要があります。その場合でも、オプションとして、スキーマに基づかない文書も同一の列に格納できるように指定することができます。
参照しているあらゆるXML Schemaに準拠するように列または表データをエンコードします。各行(文書)はあらゆるXML Schemaを参照でき、そのXML Schemaは、その特定のXML文書をエンコードするために使用されます。この場合も、オプションとして、スキーマに基づかない文書も同一の列に格納できるように指定することができます。
同一のXML Schemaについて複数のバージョンを使用できることに注意してください。異なるバージョンに準拠する複数の文書を格納すると、それぞれが参照するXML Schemaに応じてエンコーディングを行います。
エンコーディングにあらゆるXML Schemaを使用できるように指定するには、表を作成する際にオプションALLOW ANYSCHEMA
を使用します。
注意: コピーに基づくXML Schema拡張の使用が予想される場合は、オプションALLOW ANYSCHEMA を使用しないことをお薦めします(「コピーに基づくスキーマの拡張の使用」を参照)。このオプションを使用する場合、拡張されたXML Schemaにどの行(文書)が準拠するか決定することは不可能です。コピーに基づく拡張時には準拠する行は変換されず、したがってあとからデコード可能になることもありません。 |
ALLOW NONSCHEMA
オプションを使用すると、XML Schemaに基づくエンコーディングを使用する表や列に対して、スキーマに基づかない文書も受け入れることができるように指定できます。キーワードXMLSCHEMA
がない場合、エンコーディングはスキーマに基づかない文書に対して行われます。キーワードALLOW NONSCHEMA
はないが、キーワードXMLSCHEMA
がある場合、エンコーディングは、指定された単一のXML Schemaに対して行われます。キーワードALLOW NONSCHEMA
はないが、キーワードALLOW ANYSCHEMA
がある場合、エンコーディングは、参照されているあらゆるXML Schemaに対して行われます。
XML文書を、文書に対応しないXMLType
表または列に挿入しようとすると、エラーが発生します。
可能なオプションについて表6-2にまとめます。
表6-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
列に格納されます。
例6-21 XML Schemaに基づくXMLType表および列に対するCLOB記憶域の指定
この例は、XMLType
表およびXMLType
列を持つ表の作成方法を示しています。ここで、XMLType
のコンテンツは、登録された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記憶域パラメータを追加できます。
構造化記憶域は、デフォルトのXMLType
記憶域モデルです。構造化記憶域では、コレクションはSQL VARRAY値にマップされます。XML コレクションは、maxOccurs
> 1であるすべての要素で、複数回出現できます。デフォルトでは、単一のLOB列を使用して、VARRAYなどのコンテンツ全体がシリアライズされます。この記憶域モデルは、ドキュメント全体の最適な収集および取出しを提供しますが、コレクションの個々のメンバーを索引付け、更新または取り出す必要がある場合には多くの制限があります。
開発者は、そのようなVARRAYの格納方法をオーバーライドし、Ordered Collection Table内の一連の行としてコレクションのメンバーを格納できます。そのためには、CREATE TABLE
文にVARRAY STORE AS
句を明示的に追加します。CREATE TABLE
文によって生成されるLOB列に対してSTORE AS
句を追加することもできます。コレクションおよびLOB列は、SQLオブジェクト・リレーショナル表記法を使用して識別される必要があります。
例6-22は、XMLType
表およびXMLType
列を持つ表の作成方法を示しています。ここで、XMLType
インスタンスのコンテンツは、登録済のXML Schemaによって定義されたグローバル要素に限定され、XMLType
インスタンスのコンテンツはSQLオブジェクトのセットとして格納されます。
例6-22 XML Schemaに基づく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"."Actions"."Action" STORE AS TABLE action_table1 ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$))) VARRAY "XMLDATA"."LineItems"."LineItem" STORE AS TABLE lineitem_table1 ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$))) LOB ("XMLDATA"."Notes") STORE AS (TABLESPACE USERS ENABLE STORAGE IN ROW STORAGE(INITIAL 4K NEXT 32K)); 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"."Actions"."Action" STORE AS TABLE action_table2 ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$))) VARRAY xml_document."XMLDATA"."LineItems"."LineItem" STORE AS TABLE lineitem_table2 ((PRIMARY KEY (NESTED_TABLE_ID, SYS_NC_ARRAY_INDEX$))) LOB (xml_document."XMLDATA"."Notes") STORE AS (TABLESPACE USERS ENABLE STORAGE IN ROW STORAGE(INITIAL 4K NEXT 32K));
例6-22では、Action
要素のコレクションおよびLineItem
要素のコレクションがOrdered Collection Tableの一連の行としてそれぞれ格納されるように指定する方法、およびNotes
要素のコンテンツを含むLOBに対してLOBのSTORAGE句を指定する方法も示しています。
構造化記憶域を使用してXMLデータを格納する場合は、XML文書内で1回のみ出現する要素および属性に対して、標準的なリレーショナル制約を指定できます。例6-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データの構造化記憶域について、registerSchema
によって作成された表、オブジェクトおよびオブジェクト属性の名前が、あらゆるアプリケーション・ネーミング標準に準拠した一般的な名前であることを保証するため。この場合は、GENTYPES
またはGENTABLES
をTRUE
に設定します。
XML Schemaとデータベース内の既存のオブジェクトおよび表との間をマップするため。この場合は、GENTYPES
またはGENTABLES
をFALSE
に設定します。
SQLで直接作業する場合、引用符で囲まれた識別子を使用する必要のある、大/小文字の混在する名前が生成されないようにします。
(文書が相互に関連する再帰的な)XPath問合せの場合、つまり、特定のextract
、extractValue
およびexistsNode
アプリケーションでXPath式が再帰的なXMLデータをターゲットにしている場合は、XPathリライトが可能になります。XPathリライトを利用できるのは、XMLデータの構造化記憶域の場合だけです。
最も一般的に使用されるXML Schema注釈は、次のとおりです。
defaultTable
: GENTABLES
パラメータがFALSE
の場合に、各グローバル要素に生成されるデフォルトの表の名前。この注釈を空の文字列""
に設定すると、該当する要素にデフォルトの表が生成されなくなります。
SQLType
: complexType
定義の場合、対応するオブジェクト・タイプ。simpleType
定義では、XML Schemaデータ型とSQLデータ型間のデフォルト・マッピングをオーバーライドするためにSQLType
を使用します。SQLType
は、無制限の文字列をVARCHAR(4000) CHAR
値(デフォルト)ではなく、CLOB
値として格納する必要がある場合に定義するのが、一般的な使用方法です。注意: データ型NCHAR
、NVARCHAR
、またはNCLOB
は、SQLType
注釈の値としては使用できません。
maintainDOM
: 指定されているcomplexType
定義のDOM再現性を維持する必要があるかどうかを判断するために使用します。
storeVarrayAsTable
: XML Schemaのルート要素を指定します。すべてのコレクションをOrdered Collection Table(OCT)として格納するために使用します。maxOccurs > 1
で指定されている各要素に対して、1つのOCTが作成されます。OCTは、システム生成の名前で作成されます。storeVarrayAsTable
のデフォルト値はtrue
です。
これらの属性のいずれにも、値を指定する必要はありません。Oracle XML DBにより、デフォルトで、XML Schemaの登録プロセス中に適切な値が提供されます。ただし、構造化記憶域を使用する場合、少なくとも最上位のSQL型の名前を指定し、後で参照できるようにすることをお薦めします。
例6-23は、例6-1のXML Schemaのリストの一部であり、最も重要ないくつかのOracle XML DB注釈が含まれるように修正を加えています。
例6-23 一般的なスキーマ注釈の使用
<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
注釈が含まれています。
グローバルなcomplexType
PurchaseOrderType
には、生成されるSQLオブジェクトの型名を purchaseorder_t
に指定するSQLType
注釈が含まれています。この種の定義には、次の注釈が使用されます。
要素Reference
には、Reference
要素に対応するSQL属性をreference
という名前にするSQLName
注釈が指定されています。
要素Actions
には、Actions
要素に対応するSQL属性の名前をaction_collection
にするSQLName
注釈が指定されています。
要素USER
には、User
要素に対応するSQL属性の名前をemail
にするSQLName
注釈が指定されています。
要素LineItems
には、LineItems
要素に対応するSQL属性の名前をlineitem_collection
にするSQLName
注釈が指定されています。
要素Notes
には、Notes
要素に対応するSQL属性のデータ型をCLOB
にするSQLType
注釈が指定されています。
グローバルなcomplexType
LineItemsType
には、生成されるSQLオブジェクトの型名をlineitems_t
に指定するSQLType
注釈が含まれています。この種の定義には、次の注釈が使用されます。
LineItem
要素には、LineItems
要素に対応するSQL属性のデータ型をlineitem_varray
にするSQLName
注釈と、コレクションを管理するSQLオブジェクトの型名をlineitem_v
にするSQLCollName
注釈が指定されています。
グローバルなcomplexType
LineItemType
には、生成されるSQLオブジェクトの型名をlineitem_t
に指定するSQLType
注釈が含まれています。
グローバルなcomplexType
PartType
には、生成されるSQLオブジェクトの型名をpart_t
に指定するSQLType
注釈が含まれています。注釈xdb:maintainDOM = "false"
も含まれています。これは、Oracle XML DBでこの型に基づく要素のDOM再現性を保持する必要がないことを指定します。
例6-24は、注釈付きXML Schemaの登録で作成された表およびオブジェクトの一部を示しています。
例6-24 注釈付き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)が作成されました。
表6-3、表6-4および表6-5に要素および属性の宣言で指定できるOracle XML DBの注釈を示します。接頭辞csx
があるもの以外のすべての注釈は、構造化記憶域に対して登録されたXML Schemaに適用できます。これには、オブジェクト・リレーショナル形式で格納されるハイブリッド記憶域の一部が含まれます。
次の注釈は、非構造化記憶域に対して登録されたXML Schemaに適用されます。
xdb:defaultTable
xdb:defaultTableSchema
次の注釈は、バイナリXML記憶域に対して登録されたXML Schemaに適用されます。
xdb:defaultTable
xdb:defaultTableSchema
xdb:tableProps
csx:encodingType
属性 | 値 | デフォルト | 説明 |
---|---|---|---|
|
任意の列STORAGE句 |
|
デフォルトの |
|
表の名前 |
要素名に基づきます。 |
このXML SchemaのXMLインスタンスを格納する必要があるSQL表の名前を指定します。これは、表の名前が指定されていないAPIおよびプロトコル(FTP、HTTP(S)など)を使用してXMLを挿入する場合に最も有効です。構造化記憶域およびバイナリXML記憶域に適用されます。 |
|
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
|
任意のバイナリXMLエンコーディング型脚注1 |
XML Schemaデータ型に基づきます。 |
この要素または属性のノード値をエンコードするために使用されるエンコーディング型を指定します。これを使用できるのは、要素 |
|
|
|
|
|
|
|
|
任意の正の整数 |
1 |
要素が出現できる回数の最大値を指定します。値が |
|
|
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
|
任意のSQLコレクション型 |
要素名から生成された名前 |
このXML要素に対応するSQLコレクション型の名前。XML要素は、 |
|
|
|
|
|
SQL識別子 |
要素名 |
このXML要素にマップされるSQLオブジェクト内での属性の名前。 |
|
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
|
任意のSQLデータ型脚注2。ただし |
要素名から生成された名前 |
このXML要素の宣言に対応するSQL型の名前。 |
|
|
TRUE |
|
|
任意の表STORAGE句 |
|
デフォルトの |
|
|
|
|
脚注1 「XML Schemaデータ型のバイナリXMLエンコーディング型へのマッピング」を参照してください。
脚注2 「XML Schemaデータ型のSQLデータ型へのマッピング」を参照してください。
表6-4 グローバルなcomplexType要素を宣言する要素内の注釈
属性 | 値 | デフォルト | 説明 |
---|---|---|---|
|
任意のバイナリXMLエンコーディング型脚注1 |
XML Schemaデータ型に基づきます。 |
この要素または属性のノード値をエンコードするために使用されるエンコーディング型。これを使用できるのは、要素 |
|
|
|
|
|
任意のSQLユーザー名 |
XML Schemaを登録するユーザー |
|
|
任意のSQLデータ型脚注2。ただし |
要素名から生成された名前 |
このXML要素の宣言に対応するSQL型の名前。 |
脚注1 「XML Schemaデータ型のバイナリXMLエンコーディング型へのマッピング」を参照してください。
脚注2 「XML Schemaデータ型のSQLデータ型へのマッピング」を参照してください。
表6-5 XML Schema宣言内の注釈
属性 | 値 | デフォルト | 説明 |
---|---|---|---|
|
|
|
|
|
|
|
|
関連項目: xdb:maxOccurs 、xdb:translate およびxdb:srclang の詳細は、「変換のためのXML SchemaとXMLインスタンス・ドキュメントの変更」を参照してください。 |
登録済のXML Schemaのバージョンには、Oracle XML DB注釈の完全なセットが含まれています。例6-8および例6-9に示されているように、登録されているXML Schemaの場所は、XML Schemaがローカル・スキーマかグローバル・スキーマかによって異なります。
ユーザーが指定した注釈、またはスキーマの登録処理で追加された注釈の値に対して、登録されているXML Schemaの問合せが可能です。例6-25は、XMLデータの構造化記憶域に対してXML Schemaで宣言されているグローバルなcomplexType
定義、およびそれに対応するSQLオブジェクト型とDOM再現性値を示しています。
例6-25 登録された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エンコーディング型にマップされます。
図6-2に、Oracle XML DBで、XML文書およびXML Schemaに指定されたマッピングを使用して、XML Schemaに基づくXMLType
表を作成する方法を示します。XML Schemaで指定された格納方式に応じて、XMLインスタンス・ドキュメントは、バイナリXML形式またはCLOB
値として単一のXMLType
列に格納されるか、複数のオブジェクト・リレーショナル列を使用して格納されます。
図6-2 Oracle XML DBによるXML Schemaに基づくXMLType表のマッピング方法
この項では、PL/SQLパッケージDBMS_XMLSCHEMA
を使用して、XML Schema属性および要素のデータ型をSQLデータ型にマップする方法について説明します。
注意: XML Schema登録時に、XML Schemaデータ型からマップされるSQLデータ型に直接アクセスしないでください。これらのSQL型はOracle XML DBの実装の一部です。ユーザーが使用できるように公開されたものではありません。オラクル社は製品パッチなどで、実装をいつでも変更する権利を留保します。オラクル社によるそうした変更は、XMLの抽象的概念に従うアプリケーションには影響しませんが、それらのデータ型に直接アクセスするアプリケーションには影響を与えることがあります。 |
例6-26は、XML Schemaデータ型をSQLデータ型にマッピングする単純な例を示しています。属性SQLType
を使用してデータ型のマッピングを指定しています。また、属性SQLName
を使用して、各種のXML要素および属性で使用するオブジェクト属性を指定しています。
例6-26 属性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オブジェクト型にマップする方法について説明します。図6-3に、この例を示します。
図6-3 simpleTypeのマッピング: XML文字列からSQLのVARCHAR2またはCLOB
表6-6から表6-9までに、XML Schema定義に指定された、SQLへのXML Schema simpleType
のデフォルトのマッピングを示します。次に例を示します。
XML Schema基本型は、最も近いSQLデータ型にマップされます。たとえば、DECIMAL
、POSITIVEINTEGER
およびFLOAT
は、すべてSQLのNUMBER
にマップされます。
XML Schema列挙型は、1つのRAW(
n
)
オブジェクト属性を持つSQLオブジェクト型にマップされます。n
の値は、列挙の宣言で使用可能な値の数によって決定されます。
XML SchemaリストまたはUNION型は、SQLの文字列(VARCHAR2
またはCLOB
)データ型にマップされます。
表6-6 XML Schema文字列データ型のSQLへのマッピング
XML Schema文字列型 | lengthまたはmaxLengthファセット | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|---|
|
n |
|
|
|
- |
|
|
表6-7 SQLへのXML Schemaバイナリ・データ型(hexBinary/base64Binary)のマッピング
XML Schemaバイナリ型 | lengthまたはmaxLengthファセット | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|---|
|
n |
|
|
|
- |
|
|
表6-8 SQLへのXML Schema数値基本型のデフォルトのマッピング
XML Schema simpleType | デフォルトSQLデータ型 | 指定されたtotalDigits (m)、fractionDigits(n) | 互換性のあるSQLデータ型 |
---|---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表6-9 XML Schema日時データ型のSQLへのマッピング
XML Schema日時型 | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
表6-10 SQLへのその他のXML Schema基本および派生データ型のデフォルトのマッピング
XML Schema基本および派生型 | デフォルトSQLデータ型 | 互換性のあるSQLデータ型 |
---|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
|
|
なし |
|
|
なし |
Oracle XML DBでは、属性SQLType
の値としてNCHAR
、NVARCHAR
およびNCLOB
はサポートされません。要素の型に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値(デフォルト、推奨)または順序付けられていない表(属性maintainOrder
がfalse
に設定されている場合)になります。VARRAY値のデフォルトの記憶域はOrdered Collections Table(OCT)です。属性storeAsLob
をtrue
に設定することによって、かわりに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>
この項では、PL/SQLパッケージDBMS_XMLSCHEMA
を使用して、XML Schema属性および要素のデータ型をバイナリXMLデータに使用されるエンコーディング型にマップする方法について説明します。
オプションREGISTER_BINARYXML
を使用してXML Schemaを登録すると、そのXML Schemaを参照するXMLインスタンス・ドキュメントがバイナリXML形式で格納され、XML Schemaデータ型がバイナリXMLデータにエンコードされます。各XML Schemaデータ型はデフォルトのバイナリXMLデータ型にマップされますが、このデフォルト・マッピングは、XML属性csx:encodingType
を使用することによってオーバーライドすることができます。
XML Schemaが異なると、異なるバイナリXMLエンコーディングが指定される可能性があります。XMLType
表または列を作成した際にオプションALLOW ANYSCHEMA
を使用した場合は、異なるXML Schemaを参照する複数のXML文書、したがって異なるバイナリXMLエンコーディングになっている可能性があるXML文書が、同一のXMLType
列または表に格納される可能性があります。
注意: バイナリXMLエンコーディング型は、問合せ結果で使用された値のデータ型には影響しません。たとえば、extractValue などのSQL関数はSQL値を使用する問合せからデータを戻し、そのため、XML SchemaとSQLの間でデフォルトのデータ型マッピングを使用します。 |
表6-11は、使用可能なバイナリXMLエンコーディング型の説明です。表6-12は、それらがデフォルトでXML Schemaデータ型にマップされる方法と、デフォルトのマッピングをオーバーライドするために使用できるバイナリXMLエンコーディング型の説明です。
表6-11 バイナリXMLエンコーディング型
バイナリXMLエンコーディング型 | 説明 |
---|---|
|
UTF-8文字データ |
|
バイナリ・データ |
|
これはXML Schemaに対して常に |
|
符号付き、2の補数、ビッグ・エンディアンの整数(1、2、4、8バイトのいずれか) |
|
2の補数、ビッグ・エンディアンの整数(1、2、4、8バイトのいずれか) |
|
IEEE-754浮動小数点数(4または8バイト) |
|
Oracle内部数値表記(最大22バイト) 1.0 x 10 -130〜1.0 x 10 126の数値最大精度: 38桁。最大スケール: -84〜127。 |
|
グレゴリオ暦日付のOracle内部形式(7バイト) 小数秒なし。タイムゾーン情報なし。 |
|
タイムゾーン情報を持つグレゴリオ暦日付のOracle内部形式(タイムスタンプ) 小数秒の1〜9桁。本来 |
|
1970年1月1日からの秒数(4または8バイトの符号付きバイナリ) 小数秒なし。タイムゾーン情報なし。 |
|
本来 |
|
符号なし整数。0から始まり、XML Schemaで定義された桁で、可能な列挙値ごとに1ずつ増加します。 |
|
トークンIDと後続する接頭辞ID(4または8バイトおよび後続する2バイト) |
表6-12 XML Schemaデータ型のバイナリXMLエンコーディング型へのマッピング
XML Schema型 | バイナリXMLエンコーディング型 | 互換性のあるエンコーディング型 |
---|---|---|
|
|
なし |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
なし |
|
|
|
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
|
なし |
|
内部エンコーディング脚注1 |
なし |
|
|
なし |
|
|
|
|
|
なし |
|
|
なし |
脚注1 XML SchemaタイプanyType
にはエンコーディング型を指定できません。