ヘッダーをスキップ
Oracle® XML DB開発者ガイド
11gリリース2 (11.2)
B70200-03
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

7 XML Schemaの格納と問合せ: 基本

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およびOracle XML DBの概要

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 &quot;de Finibus Bonorum et Malorum&quot;, 
         written by Cicero in 45 BC
 
&quot;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?&quot;
 
1914 translation by H. Rackham
 
&quot;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?&quot;
 
Section 1.10.33 of &quot;de Finibus Bonorum et Malorum&quot;, written by Cicero
in 45 BC
 
&quot;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.&quot;
 
1914 translation by H. Rackham
 
&quot;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.&quot;
  </Notes>
</po:PurchaseOrder>

注意:

使用されているURLhttp://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsdは、データベース内の登録済XMLスキーマを一意に識別する名前です。これはXML Schema文書の場所を示す必要はありません。XML Schemaのターゲット名前空間は、XML Schemaの場所を示すURLとは異なるURLで、要素および型が宣言される抽象名前空間が指定されます。

XML Schemaには、オプションでターゲット・ネームスペースのURLを指定できます。この属性が省略されている場合、XML Schemaにターゲット名前空間はありません。通常、ターゲット名前空間は、XML SchemaのURLと同じです。

XMLインスタンス・ドキュメントには、ルート要素のネームスペース(XML Schemaのターゲットネームスペースと同一)、およびこのルート要素を定義するXML Schemaの場所(URL)が指定されている必要があります。場所は、属性xsi:schemaLocationで指定されます。XML Schemaにターゲットのネームスペースがない場合は、xsi:noNamespaceSchemaLocation属性を使用してXML Schema URLを指定します。


Oracle XML DBでのXML Schemaの使用

Oracle XML DBは、厳密な型指定およびその他の強力なXML Schemaのプロパティを使用し、XMLデータベース・データを安全で効率的に処理します。


注意:

バイナリXML記憶域を使用して格納されたXMLデータを使用すると、DTDを使用して、そこで定義されたXMLエンティティを取得できます。ただし、DTD内の構造や型情報は、Oracle XML DBでは使用されません。使用される情報は、エンティティのみです。

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

XML Schemaを使用する理由

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データ型およびオブジェクト・リレーショナルな表および列に効率的にマップするために使用されます。

Oracle XML DBにおけるDTDのサポート

DTDは、XML文書の使用可能な構造を定義する一連の規則です。DTDは、SGMLから書式を導出し、DOCTYPE要素を使用するか、またはDOCTYPE参照を介して外部ファイルを使用してXML文書と関連付けることができるテキスト・ファイルです。オブジェクト・リレーショナル記憶域またはバイナリXML記憶域への構造化マッピングを提供するXML Schemaのサポートに加えて、Oracle XML DBでは、XMLインスタンス・ドキュメントでのDTDの指定もサポートされます。DTDはマッピングの導出には使用されませんが、XMLプロセッサからDTDにアクセスし、解析することはできます。

インラインDTDの定義

XMLインスタンス・ドキュメントにインラインDTDの定義が含まれる場合、その定義はドキュメントの解析時に使用されます。すべてのDTDの検証およびエンティティ宣言の処理は、この時点で行われます。ただし、解析後、実体参照は実際の値で置換され、元の実体参照は失われます。

外部DTDの定義

Oracle XML DBでは、Oracle XML DBリポジトリに格納された外部DTDの定義もサポートされます。/public/flights.dtdなど外部DTDの定義を含むXML文書を処理する必要があるアプリケーションでは、最初に、DTDドキュメントが/public/flights.dtdというパスでOracle XML DBに格納されていることを確認する必要があります。

DBMS_XMLSCHEMAを使用したXML Schemaの管理

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の拡張」を参照してください。

Oracle XML DBへの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のソース・ドキュメント。この値は、VARCHARCLOBBLOBBFILEXMLTypeまたはURITypeです。

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

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


    注意:

    オプションREGISTER_BINARYXMLを指定する場合は、パラメータGENTYPESFALSEに設定する必要があります。


関連項目:

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

例7-3のコードは、XML Schemaをhttp://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsdというURLに登録します。この例では、データベース・サーバーのローカル・ファイル・システム上のファイルからソース・ドキュメントを読み取るために、BFILEメカニズムを使用してXML Schemaを登録する方法を示しています。

例7-3 DBMS_XMLSCHEMA.REGISTERSCHEMAを使用した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を登録するとき、スキーマを登録しても、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表および列を作成できます。

XML Schema登録の基本性質

すべてのDDL操作と同様に、XML Schema登録は、非トランザクション的なものです。しかし、登録は、次の意味において、アトミックです。

  • 登録が正常に終了した場合、操作は自動コミットされます。

  • 登録が失敗した場合、データベースは登録開始前の状態にロールバックされます。

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データのためのXML Schema登録のデバッグ

オブジェクト・リレーショナル形式で格納される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登録時に作成されるSQLデータ型

XML Schemaがオブジェクト・リレーショナル形式で格納されたXMLデータとともに使用するために登録された場合、パラメータGENTYPESTRUEだと、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 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の登録時に生成された内部構造体を使用しない

一般に、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に依存します。

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

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

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

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

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

XML Schemaの削除

プロシージャDBMS_XMLSCHEMA.deleteSchemaを使用すると、登録されたXML Schemaを削除できます。これにより、次のことが行われます。

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

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

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

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

  5. delete_cascadeまたはdelete_cascade_forceのいずれかが使用される場合は、デフォルト表をドロップします。delete_cascade_forceが指定されていて、XML Schemaにも依存している他の表にインスタンスがある場合、エラーが発生します。

DBMS_XMLSCHEMA.DELETESCHEMAオプション

プロシージャ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-7DELETE_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を参照しないように変換されていることを確認してください。そうしない場合、消去後にそれらの文書をデコードできなくなります。

XMLTypeのXML Schema関連メソッド

表7-1に、XML Schemaを操作する際に役立つXMLTypeメソッドを示します。

表7-1 XMLTypeのXML Schema関連メソッド

XMLTypeのメソッド 説明
isSchemaBased()

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

getSchemaURL() 

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

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

XMLTypeインスタンスを登録されたXML Schemaに対して検証します。

第11章「XMLTypeデータの変換および検証」を参照してください。


ローカルXML SchemaおよびグローバルXML Schema

XML Schemaは、ローカルまたはグローバルとして登録できます。

  • ローカルなXML Schemaは、デフォルトでは所有者のみが参照できます。

  • グローバルなXML Schemaは、デフォルトではすべてのデータベース・ユーザーが参照および使用できます。

XML Schemaを登録する場合、PL/SQLパッケージDBMS_XMLSCHEMAはOracle XML DBリポジトリに対応するリソースを追加します。XML SchemaのURLにより、リポジトリ内のXML Schemaリソースのパス名を判断します(また、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaのパラメータSCHEMAURLにも関連付けられます)。


注意:

Oracle Enterprise Managerでは、ローカルおよびグローバルに登録されたXML Schemaは、それぞれプライベートおよびパブリックと呼ばれます。

ローカルXML Schema

デフォルトでは、XML SchemaをOracle XML DBに登録すると、登録したユーザーがこのXML Schemaの所有者になります。XML Schema文書への参照は、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を指定できます。

グローバル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)の再現性とは、DOM検索のために、取得されたXML文書を元のXML文書と同じ構造に保持するという概念です。DOM再現性は、Oracle XML DBに格納されたXML文書の精度および整合性を保証するために必要です。

DOM再現性の概要

DOM再現性は、XMLドキュメント内のすべての情報が、無意味な空白を除いて維持されていることを意味します。DOM再現性がある場合、データベースから取得されたXMLデータは、無意味な空白のみを除いて、データベースに挿入される前と同一の情報を持ちます。「DOM再現性」という用語が使用されるのは、この種類の再現性はDOM検索で特に重要だからです。

XMLデータのバイナリXML記憶域では、重要な情報のすべてがバイナリXML形式にエンコードされ、DOM再現性を保証しています。XMLデータの構造化記憶域では、XML Schemaで宣言された要素および属性は、対応するSQLオブジェクト型の個別の属性にマップされます。ただし、XMLインスタンス・ドキュメント内の次の情報は、これらのオブジェクト属性に格納されません。

  • 名前空間宣言

  • コメント

  • 接頭辞情報

そのかわりに、Oracle XML DBは別の機構を使用してこの情報を追跡し、インスタンス・レベルのメタデータとして記録します。

SYS_XDBPD$と構造化記憶域のDOM再現性

オブジェクト・リレーショナル形式で格納された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列が存在しない場合、コメント、処理命令などの情報が失われる可能性があるためです。


XML変換

Oracle XML DBリポジトリ内のXML文書をXMLTypeインスタンスとして格納できます。これらのインスタンスには、構造化記憶域モデル(オブジェクト・リレーショナル記憶域)、非構造化記憶域モデル(CLOB)、およびバイナリXML記憶域モデルから任意のモデルを使用できます。これらの文書には、様々な(自然)言語に翻訳しなければならない文字列が含まれている場合があります。通常は、元の文字列とその翻訳を両方ともリポジトリに格納します。ユーザーの言語設定に応じて、これらの文字列を取得および操作できます。


注意:

オブジェクト・リレーショナル形式で格納されたXML Schemaは変換できません。

変換のためのXML SchemaとXMLインスタンス・ドキュメントの変更

この項では、XML Schemaと関連のXMLインスタンス・ドキュメントを変換可能にするためにそれらに加える必要がある変更について説明します。

XML Schema内での変換可能な要素の指示

XML Schema内で、変換する要素ごとに属性xdb:translateを指定する必要があります。属性xdb:translateには、次の制限が適用されます。

  1. 属性xdb:translateは、simpleContentを持つcomplexType要素にのみ指定できます。ここで、simpleContentは、string型の拡張または制限である必要があります。ただし、complexType要素にxdb:translateフラグが設定されている場合、その子孫にはこのフラグを設定できません。

  2. 属性xdb:translateは、単一値要素(1つだけの変換を持つ要素)にのみ設定できます。そのような要素の場合、maxoccursの値は0または1である必要があります。この属性を複数値要素に設定する場合、要素を一意に識別するID属性を要素が持つ必要があります。

XML Schemaの登録時に、PL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaは、XML Schemaがこれらの制限を満たしているかを確認します。

XMLインスタンス・ドキュメント内での変換言語属性の指示

次の変換言語属性がサポートされています。

  • xml:lang: 変換をサポートするXML Schemaに関連付けられたインスタンス・ドキュメントには、変換言語を指定する必要があります。これは、変換のたびに属性xml:langを使用して注釈を付けることで指定できます。属性xml:langで使用できる値は、IETF RFC 3066で識別される言語識別子です。

  • xdb:srclang: 複数値要素、つまり、複数の変換を持つことができる要素には、1つの変換のみをソース言語変換として使用できます。この変換は、属性xdb:srclangによって指定されます。これは、セッション言語が指定されていない場合に戻されるデフォルトの変換です。

XML文書を変換可能にする方法

この項では、変換を指定する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:translatetrueに設定します。これは、単一値要素(xdb:maxOccurs1)です。例7-12は、属性xdb:translatetrueに設定されている新規の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:maxOccursunboundedに設定します。ただし、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:langsession languageに設定され、属性xdb:srclangtrueに設定されています。

      例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:srclangtrueに設定されます。

      例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:srclangtrueの言語と同じです。

    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述語を持つ索引を作成する必要があります。

    XMLSerializeXDBURITypeなどの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.enableTranslationDBMS_XMLTRANSLATIONS.disableTranslation: セッション・レベルで変換の有効化/無効化を行います。問合せは、変換が無効な場合は主ドキュメントに作用し、有効な場合は変換済ドキュメントに作用します。

    • DBMS_XMLTRANSLATIONS.getBaseDocument: すべての変換とともに完全なドキュメントを戻します。

  • 更新: Oracle SQL関数updateXMLを使用して変換済のノードを更新します。ただし、変換言語を指定せずに変換済ノードを更新しようとした場合、エラーが発生します。次のPL/SQLプロシージャは、変換済のドキュメントへの更新操作をサポートします。

    • DBMS_XMLTRANSLATIONS.updateTranslation: この関数は、指定したxpathにある変換を特定の言語で更新します。特定の言語での変換が存在しない場合は、それが挿入されます。

    • DBMS_XMLTRANSLATIONS.setSourceLang: このプロシージャは、指定したxpathにあるソース言語を指定した言語に設定します。

XML Schemaに基づくXMLTypeおよび列の作成

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

図7-1 XMLType表の作成: CREATE TABLE

図7-1の説明が続きます
「図7-1 XMLType表の作成 - CREATE TABLE」の説明

図7-2 XMLType表の作成: XMLType_table

図7-2の説明が続きます
「図7-2 XMLType表の作成 - XMLType_table」の説明

図7-3 XMLType表の作成: table_properties

図7-3の説明が続きます
「図7-3 XMLType表の作成 - table_properties」の説明

図7-4 XMLType表の作成: XMLType_virtual_columns

図7-4の説明が続きます
「図7-4 XMLType表の作成 - XMLType_virtual_columns」の説明


注意:

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

XPointer表記法のサブセットを使用して、XML Schemaの場所および要素名を含む1つのURLを指定することもできます。第4章「XMLTypeの操作」も参照してください。

例7-20は、2つのCREATE TABLE文を示しています。最初の文は、XMLTypepurchaseorder_as_tableを作成します。2番目の文は、XMLTypexml_documentを備えたリレーショナル表purchaseorder_as_columnを作成します。各表で、XMLTypeインスタンスは、URL http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsdで登録したXML Schemaによって定義されたPurchaseOrder要素に限定されます。

例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に基づくデータのXMLType記憶域オプションの指定

XML Schemaを参照するXMLインスタンス・ドキュメントを格納する表を手動で作成する場合、使用する記憶域オプションを指定できます。特定のXMLType記憶域モデルを指定するには、CREATE TABLE文でSTORE AS句を使用します。それ以外の場合は、XML Schemaの登録時に指定した記憶域モデルが使用されます。登録時に記憶域モデルが指定されなかった場合、オブジェクト・リレーショナル記憶域が使用されます。

この項では、XML Schemaに基づくデータのための記憶域オプションを指定する際に必要な知識について説明します。また、XML Schema注釈を使用して、自動的に作成された表に記憶域オプションを指定することもできます。

XML Schemaに基づくデータのバイナリXML記憶域

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 ANYSCHEMAオプションを使用すると、インスタンス・ドキュメントで参照されるXML Schemaは検証のみに使用されます。問合せ時には使用されません。データの問合せでは、XML Schemaに基づかないデータのように扱われます。

  • コピーに基づくXML Schema拡張を使用することが見込まれる場合、オプションALLOW ANYSCHEMAを使用しないことをお薦めします(「コピーに基づくスキーマの拡張の使用」参照)。このオプションを使用する場合、拡張されたXML Schemaにどの行(文書)が準拠するか決定することは不可能です。コピーに基づく拡張時には準拠する行は変換されず、後からデコード可能になることもありません。


ALLOW NONSCHEMAオプションを使用すると、XML Schemaに基づくエンコーディングを使用する表や列に対して、スキーマに基づかない文書も受け入れることができるように指定できます。キーワードXMLSCHEMAがない場合、エンコーディングはスキーマに基づかない文書に対して行われます。キーワードALLOW NONSCHEMAはないが、キーワードXMLSCHEMAがある場合、エンコーディングは、指定された単一のXML Schemaに対して行われます。キーワードALLOW NONSCHEMAはないが、キーワードALLOW ANYSCHEMAがある場合、エンコーディングは、参照されているあらゆるXML Schemaに対して行われます。

XML文書を、文書に対応しないXMLType表または列に挿入しようとすると、エラーが発生します。

可能なオプションについて表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 TABLEALLOW NONSCHEMAとともに使用し、ALLOW ANYSCHEMAとともには使用しない場合、XML Schemaに基づく文書を含むすべての文書が、XML Schemaに基づかないエンコーディングを使用してエンコードされます。後で、同じ表でALTER TABLEALLOW ANYSCHEMAとともに使用する場合、ALTER TABLE操作より前に格納された文書のエンコーディングには影響を与えません。このような文書はすべて、XML Schemaを参照するかどうかにかかわらず、XML Schemaに基づかないエンコーディングを使用して引き続きエンコードされます。ALTER TABLE操作より後で表に挿入されるXML Schemaに基づく文書のみが、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記憶域パラメータを追加できます。

XML Schemaに基づくデータの構造化記憶域

構造化記憶域では、コレクションは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)も同様に圧縮されます。


関連項目:

  • XML Schema注釈を使用した記憶域オプションの指定については、「Oracle XML Schema注釈」

  • OLTPの圧縮については、『Oracle Database SQL言語リファレンス』


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を使用して指定した格納方式よりも優先されます。


関連項目:


XMLType表および列に対するリレーショナル制約の指定

構造化記憶域を使用してXMLデータを格納する場合は、XML文書内で1回のみ出現する要素および属性に対して、標準的なリレーショナル制約を指定できます。例7-22に、表の作成時にオブジェクト・リレーショナル表記法を使用して一意制約と外部キー制約を定義する方法を示します。

非構造化記憶域を使用するXMLType表および列には、制約を定義できません。


関連項目:


OracleでのXML Schemaの注釈

XML Schemaに注釈を付けることによって、XML Schema登録処理によって生成されるオブジェクトおよび表に影響を与えることができます。これを行うには、Oracle特有の属性を、XML Schemaによって宣言されるcomplexTypeelementおよびattributeの定義に追加します。

Oracle XML DBによって使用される大部分のXML属性は、名前空間http://xmlns.oracle.com/xdbに属します。XMLデータをバイナリXML形式でエンコードするために使用されるXML属性は、名前空間http://xmlns.oracle.com/2004/CSXに属します。XML Schemaの注釈の処理を単純化するために、名前空間接頭辞はXML Schemaのルート要素で宣言することをお薦めします。

XMLスキーマ注釈の一般的な使用

XML Schemaに注釈を付ける一般的な理由は、次のとおりです。

  • XMLデータの構造化記憶域に対してPL/SQLプロシージャDBMS_XMLSCHEMA.registerSchemaで作成された表やオブジェクト、オブジェクト属性の名前が、わかりやすくすべてのアプリケーション・ネーミング標準に準拠することを保証するため。この場合は、パラメータGENTYPESまたはGENTABLESTRUEに設定します。

  • XML Schemaとデータベース内の既存のオブジェクトおよび表との間をマップするため。この場合は、パラメータGENTYPESまたはGENTABLESFALSEに設定します。

  • SQLで直接作業する場合、引用符で囲まれた識別子を使用する必要のある、大/小文字の混在する名前が生成されないようにします。

  • 文書が相互に関連する再帰的なXPath問合せの場合に、構造化記憶域のXPathリライトを可能にします。これは、再帰的なXMLデータをターゲットとしているXPath式の引数を使用する、SQL/XMLアクセスおよび問合せ関数の特定の用途に適用されます。

最も一般的に使用されるXML Schema注釈は、次のとおりです。

  • xdb:defaultTable: GENTABLESパラメータがTRUEの場合に、各グローバル要素に生成されるデフォルトの表の名前。この注釈を空の文字列""に設定すると、該当する要素にデフォルトの表が生成されなくなります。

  • xdb:SQLName: XML Schemaに定義されている各要素または属性に対応するSQLオブジェクト属性の名前。

  • xdb:SQLType: complexType定義の場合、対応するオブジェクト・タイプ。simpleType定義では、XML Schemaデータ型とSQLデータ型間のデフォルト・マッピングをオーバーライドするためにSQLTypeを使用します。SQLTypeは、無制限の文字列をVARCHAR(4000) CHAR値(デフォルト)ではなく、CLOB値として格納する必要がある場合に定義するのが、一般的な使用方法です。注意: データ型NCHARNVARCHAR、またはNCLOBは、SQLType注釈の値としては使用できません。

  • xdb:SQLCollType - 要素のコレクションを管理するVARRAY型を指定するために使用します。

  • 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型の名前を指定し、後で参照できるようにすることをお薦めします。

XML Schema注釈の例

例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_tlineitems_tlineitem_vlineitem_tおよびpart_tという型が作成されました。これらの型で定義された属性は、SQLName注釈の指定に従って名前が付けられます。

  • purchaseorder_tによって定義されたNotes属性のデータ型は、CLOBになります。

  • part_tに、位置指定ディスクリプタ(PD)属性は含まれていません。

  • LineItemおよびAction要素のコレクションを管理するために、Ordered Collection Table(OCT)が作成されました。

使用できるOracle XML DBのXML Schema注釈

表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 要素内の注釈

属性 デフォルト 説明

xdb:columnProps

任意の列STORAGE句

NULL

デフォルトのCREATE TABLE文に挿入される列STORAGE句を指定します。主に、SQL表にマップされる要素(最上位の要素の宣言および表外の要素の宣言)に有効です。

xdb:defaultTable

表の名前

要素名に基づきます。

このXML SchemaのXMLインスタンスを格納する必要があるSQL表の名前を指定します。これは、表の名前が指定されていないAPIおよびプロトコル(FTP、HTTP(S)など)を使用してXMLを挿入する場合に最も有効です。構造化記憶域およびバイナリXML記憶域に適用されます。

xdb:defaultTableSchema

任意のSQLユーザー名

XML Schemaを登録するユーザー

xdb:defaultTableによって指定された型を所有するデータベース・ユーザー(データベース・スキーマ)の名前を指定します。構造化記憶域およびバイナリXML記憶域に適用されます。

xdb:maintainDOM

true | false

TRUE

trueの場合、この要素のインスタンスは出力でDOM再現性が保持されるように格納されます。これは、要素の順序の他に、すべてのコメント、処理命令、ネームスペース宣言などが保持されることを意味します。

falseの場合は、出力で入力と同じDOM操作が保持されない場合があります。

xdb:maintainOrder

true | false

TRUE

trueの場合(一般的に推奨、デフォルト値)、コレクションはVARRAYにマップされます(LOBまたはOrdered Collection Tableに格納されます)。

falseの場合、コレクションは順序付けられていない表にマップされ、ドキュメント内の順序は保持されません

xdb:maxOccurs

任意の正の整数

1

要素が出現できる回数の最大値を指定します。値がunboundedの場合、最大出現回数は無制限です。

xdb:SQLCollSchema

任意のSQLユーザー名

XML Schemaを登録するユーザー

xdb:SQLCollTypeによって指定された型を所有するデータベース・ユーザー(データベース・スキーマ)の名前を指定します。

xdb:SQLCollType

任意のSQLコレクション型

要素名から生成された名前

このXML要素に対応するSQLコレクション型の名前。XML要素は、maxOccurs > 1と指定されている必要があります。

xdb:SQLInline

true | false

TRUE

trueの場合、この要素は埋込みオブジェクト属性(maxOccurs > 1の場合はコレクション)として表内に格納されます。

falseの場合は、REF値(maxOccurs>1の場合はREF値のコレクション)が格納されます。SQLでインラインがサポートされない特定の状況(循環参照など)では、この属性は強制的にfalseになります。

xdb:SQLName

SQL識別子

要素名

このXML要素にマップされるSQLオブジェクト内での属性の名前。

xdb:SQLSchema

任意のSQLユーザー名

XML Schemaを登録するユーザー

SQLTypeによって指定された型を所有するデータベース・ユーザー(データベース・スキーマ)の名前を指定します。

xdb:SQLType

任意のSQLデータ型脚注 1 。ただしNCHARNVARCHARおよびNCLOB除きます

要素名から生成された名前

このXML要素の宣言に対応するSQL型の名前。

xdb:srclang

true | false

TRUE

trueの場合、指定の言語変換がデフォルトの変換として使用されます。

xdb:tableProps

任意の表STORAGE句

NULL

デフォルトのCREATE TABLE文に追加されるTABLE STORAGE句を指定します。主に、グローバルな要素および表外の要素に有効です。構造化記憶域およびバイナリXML記憶域に適用されます。

xdb:translate

true | false

TRUE

trueの場合、この要素のインスタンスが変換されます。この要素をtrueに設定するには、maxOccurs属性が<=1である必要があります。


脚注1 「XML Schemaデータ型のSQLデータ型へのマッピング」を参照してください。


関連項目:

オブジェクト・リレーショナル記憶域のXMLType表を手動で作成する場合の記憶域オプションの指定については、「XML Schemaに基づくデータの構造化記憶域」を参照してください。

表7-4 グローバルなcomplexType要素を宣言する要素内の注釈

属性 デフォルト 説明

xdb:maintainDOM

true | false

TRUE

trueの場合、この要素のインスタンスは出力でDOM再現性が保持されるように格納されます。これは、要素の順序の他に、すべてのコメント、処理命令、ネームスペース宣言などが保持されることを意味します。

falseの場合は、出力で入力と同じDOM操作が保持されない場合があります。

xdb:SQLSchema

任意のSQLユーザー名

XML Schemaを登録するユーザー

SQLTypeによって指定された型を所有するデータベース・ユーザー(データベース・スキーマ)の名前を指定します。

xdb:SQLType

任意のSQLデータ型脚注 1 。ただしNCHARNVARCHARおよびNCLOB除きます

要素名から生成された名前

このXML要素の宣言に対応するSQL型の名前。


脚注1 「XML Schemaデータ型のSQLデータ型へのマッピング」を参照してください。

表7-5 XML Schema宣言内の注釈

属性 デフォルト 説明

xdb:mapUnboundedStringToLob

true | false

FALSE

trueの場合は、デフォルトで、無制限の文字列がCLOBインスタンスにマップされます。同様に、デフォルトで、無制限のバイナリ・データがBLOB値にマップされます。

falseの場合は、無制限の文字列がVARCHAR2(4000)値にマップされ、無制限のバイナリ・コンポーネントがRAW(2000)値にマップされます。

xdb:storeVarrayAsTable

true | false

TRUE

trueの場合は、VARRAYが表(OCT)として格納されます。

falseの場合は、VARRAYがLOBに格納されます。



関連項目:

xdb:maxOccursxdb:translateおよびxdb:srclangの詳細は、「変換のためのXML SchemaとXMLインスタンス・ドキュメントの変更」を参照してください。

構造化記憶域に対するXML Schema注釈のガイドライン

オブジェクト・リレーショナル形式で格納される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を使用します。

不要な場合のDOM再現性の無効化

XML Schemaの登録では、DOM再現性が維持されるように、XMLデータを格納する表がデフォルトで生成されます。多くの場合、これはデータ中心のXMLデータのDOM再現性が必要でない場合です。かわりに、DOM再現性を維持しないオブジェクト・リレーショナル表を使用することで、格納、問合せおよびデータ変更のパフォーマンスを改善できます。これを行うには、注釈xdb:maintainDOM = "false"を使用します。


関連項目:

「DOM再現性」

順序が関係ない場合のUnordered Collection要素の使用

コレクション要素間の順序が重要でない場合は、注釈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を追加します。


関連項目:

XMLType表および列を手動で作成する際のOLTP圧縮の指定の例は例7-22

大規模コレクションの表外格納

complexTypeによって定義された要素と属性の総数が1000に達すると、その型のインスタンスがデータベースに格納される場合、生成されるSQLオブジェクトを管理できる単一の表を作成することはできません。大規模コレクションがある場合は、1つの表でこのような1000列の上限にぶつかる可能性があります。

注釈xdb:defaultTableおよびxdb:SQLInlineを使用すると、このようなコレクション要素を表外に格納するように指定できます。つまり、これらのデータは個別の表に格納され、主となるコレクション表に格納されるのは、その表の行の参照のみです。表外の表の名前を指定するには、xdb:defaultTableを使用します。表外に格納するには、大規模コレクションの各要素に注釈xdb:SQLInline = "false"を指定します。

登録されたXML Schemaの問合せによる注釈の取得

登録済の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データ型のOracle XML DB記憶域へのマッピング

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表のマッピング方法

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

XML Schemaデータ型のSQLデータ型へのマッピング

この項では、PL/SQLパッケージDBMS_XMLSCHEMAを使用して、XML Schema属性および要素のデータ型をSQLデータ型にマップする方法について説明します。


注意:

XML Schema登録時に、XML Schemaデータ型からマップされるSQLデータ型に直接アクセスしないでください。これらのSQL型はOracle XML DBの実装の一部です。ユーザーが使用できるように公開されたものではありません。

オラクル社は製品パッチなどで、実装をいつでも変更する権利を留保します。オラクル社によるそうした変更は、XMLの抽象的概念に従うアプリケーションには影響しませんが、それらのデータ型に直接アクセスするアプリケーションには影響を与えることがあります。


XML Schemaデータ型のSQLへのマッピングの例

例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属性データ型のSQLへのマッピング

属性の宣言では、次のいずれかを使用してXML Schemaデータ型を指定できます。

  • 基本型

  • このXML Schemaまたは外部のXML Schema内で宣言されたグローバルなsimpleType

  • このXML Schemaまたは外部のXML Schema内で宣言されたグローバル属性に対する参照(ref="..")

  • ローカルなsimpleType

SQLデータ型および関連付けられた情報(長さおよび精度)、メモリーのマッピングの情報は、属性の基礎となるsimpleTypeから導出されます。

属性を宣言する際のXML Schema内のSQLType値のオーバーライド

入力XML Schema文書にSQLTypeの値を明示的に指定できます。この場合、指定するデータ型はスキーマ検証で使用されます。これによって、次の特定の形式のオーバーライドが可能になります。

  • デフォルトのSQLデータ型がSTRINGの場合、CHARVARCHARまたはCLOBでオーバーライドできます。

  • デフォルトのSQLデータ型がRAWの場合は、RAWまたはBLOBでオーバーライドできます。

XML Schema要素データ型のSQLへのマッピング

要素の宣言では、次のいずれかを使用してXML Schemaデータ型を指定できます。

  • 属性の宣言に対して型を指定する方法のいずれか。「XML Schema属性データ型のSQLへのマッピング」を参照してください。

  • このXML Schema文書または外部のXML Schema内で指定されたグローバルなcomplexType

  • このXML Schema文書または外部のXML Schema内に存在するグローバル要素(ref="...")

  • ローカルなcomplexType

要素を宣言する際のXML Schema内のSQLType値のオーバーライド

デフォルトでは、complexTypeに基づく要素は、各サブ要素および属性に対応するオブジェクト属性が含まれるSQLオブジェクト型にマップされます。入力XML SchemaにSQLType属性を明示的に指定することによって、このマッピングをオーバーライドできます。この場合、SQLTypeに対して次の値が使用できます。

  • VARCHAR2

  • RAW

  • CLOB

  • BLOB

これらの値によって、格納されたXMLデータはデータベース内でテキスト形式で表されます。

たとえば、SQLTypeVARCHAR2から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"の場合は、デフォルト表が作成されます。デフォルト表の名前をユーザーが指定するか、そうしない場合は要素名から導出されます。


関連項目:

simpleType値およびcomplexType値からSQLへのマッピングの詳細は、第9章「XML Schemaの格納と問合せ: 高度」を参照してください。

SQLへのsimpleTypeのマッピング

この項では、XML Schema定義によってXML Schema simpleTypeをSQLオブジェクト型にマップする方法について説明します。図7-6に、この例を示します。

図7-6 simpleTypeのマッピング: XML文字列からSQLのVARCHAR2またはCLOB

図7-6の説明が続きます
「図7-6 simpleTypeのマッピング: XML文字列からSQLのVARCHAR2またはCLOB」の説明

表7-6から表7-9までに、XML Schema定義に指定された、SQLへのXML Schema simpleTypeのデフォルトのマッピングを示します。次に例を示します。

  • XML Schemaの基本型は最も近いSQLデータ型にマップされます。たとえば、DECIMALPOSITIVEINTEGERおよび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

n < 4000の場合はVARCHAR2(n)、それ以外の場合はVARCHAR2(4000)

CHARCLOB

文字列

-

mapUnboundedStringToLob = "false"の場合は、VARCHAR2(4000)CLOB

CHARCLOB


表7-7 SQLへのXML Schemaバイナリ・データ型(hexBinary/base64Binary)のマッピング

XML Schemaバイナリ型 lengthまたはmaxLengthファセット デフォルトSQLデータ型 互換性のあるSQLデータ型

hexBinarybase64Binary

n

n < 2000の場合はRAW(n)、それ以外の場合はRAW(2000)

RAWBLOB

hexBinarybase64Binary

-

mapUnboundedStringToLob = "false"の場合はRAW(2000)BLOB

RAWBLOB


表7-8 SQLへのXML Schema数値基本型のデフォルトのマッピング

XML Schema simpleType デフォルトSQLデータ型 指定されたtotalDigits (m)、fractionDigits(n) 互換性のあるSQLデータ型

float

NUMBER

NUMBER(m+n,n)

FLOATDOUBLEBINARY_FLOAT

double

NUMBER

NUMBER(m+n,n)

FLOATDOUBLEBINARY_DOUBLE

decimal

NUMBER

NUMBER(m+n,n)

FLOATDOUBLE

integer

NUMBER

NUMBER(m+n,n)

NUMBER

nonNegativeInteger

NUMBER

NUMBER(m+n,n)

NUMBER

positiveInteger

NUMBER

NUMBER(m+n,n)

NUMBER

nonPositiveInteger

NUMBER

NUMBER(m+n,n)

NUMBER

negativeInteger

NUMBER

NUMBER(m+n,n)

NUMBER

long

NUMBER(20)

NUMBER(m+n,n)

NUMBER

unsignedLong

NUMBER(20)

NUMBER(m+n,n)

NUMBER

int

NUMBER(10)

NUMBER(m+n,n)

NUMBER

unsignedInt

NUMBER(10)

NUMBER(m+n,n)

NUMBER

short

NUMBER(5)

NUMBER(m+n,n)

NUMBER

unsignedShort

NUMBER(5)

NUMBER(m+n,n)

NUMBER

byte

NUMBER(3)

NUMBER(m+n,n)

NUMBER

unsignedByte

NUMBER(3)

NUMBER(m+n,n)

NUMBER


表7-9 XML Schema日時データ型のSQLへのマッピング

XML Schema日時型 デフォルトSQLデータ型 互換性のあるSQLデータ型

dateTime

TIMESTAMP

TIMESTAMP WITH TIME ZONEDATE

time

TIMESTAMP

TIMESTAMP WITH TIME ZONEDATE

date

DATE

TIMESTAMPWITHTIMEZONE

gDay

DATE

TIMESTAMPWITHTIMEZONE

gMonth

DATE

TIMESTAMPWITHTIMEZONE

gYear

DATE

TIMESTAMPWITHTIMEZONE

gYearMonth

DATE

TIMESTAMPWITHTIMEZONE

gMonthDay

DATE

TIMESTAMPWITHTIMEZONE

duration

VARCHAR2(4000)

なし


表7-10 SQLへのその他のXML Schema基本および派生データ型のデフォルトのマッピング

XML Schema基本および派生型 デフォルトSQLデータ型 互換性のあるSQLデータ型

boolean

RAW(1)

VARCHAR2

language(文字列)

VARCHAR2(4000)

CLOBCHAR

NMTOKEN(文字列)

VARCHAR2(4000)

CLOBCHAR

NMTOKENS(文字列)

VARCHAR2(4000)

CLOBCHAR

Name(文字列)

VARCHAR2(4000)

CLOBCHAR

NCName(文字列)

VARCHAR2(4000)

CLOBCHAR

ID

VARCHAR2(4000)

CLOBCHAR

IDREF

VARCHAR2(4000)

CLOBCHAR

IDREFS

VARCHAR2(4000)

CLOBCHAR

ENTITY

VARCHAR2(4000)

CLOBCHAR

ENTITIES

VARCHAR2(4000)

CLOBCHAR

NOTATION

VARCHAR2(4000)

CLOBCHAR

anyURI

VARCHAR2(4000)

CLOBCHAR

anyType

VARCHAR2(4000)

CLOBCHAR

anySimpleType

VARCHAR2(4000)

CLOBCHAR

QName

XDB.XDB$QNAME

なし

normalizedString

VARCHAR2(4000)

なし

token

VARCHAR2(4000)

なし


サポートされないNCHAR、NVARCHARおよびNCLOBのSQLType値

Oracle XML DBでは、NCHARNVARCHARおよびNCLOBは、属性SQLTypeの値としてサポートされません。XML要素または属性の型にNCHARNVARCHARまたはNCLOBを指定できません。また、ユーザー独自のデータ型を提供する場合は、これらのデータ型を使用しないでください。

simpleType: SQLのVARCHAR2またはCLOBへのXML文字列のマッピング

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:dateTimexsd:timeはSQLデータ型TIMESTAMPにマップされ、他のすべてのデータ型はSQLデータ型DATEにマップされます。SQLデータ型TIMESTAMPDATEには、タイムゾーン・インジケータを使用できません。

アプリケーションとタイムゾーン・インジケータの連動が必要な場合は、属性SQLTypeを使用して、SQL型をTIMESTAMP WITH TIME ZONEに指定してください。これによって、タイムゾーン・インジケータが含まれている値の適切な格納および取出しを実行できます。次に例を示します。

<element name="dob" type="xsd:dateTime"
          xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
<attribute name="endofquarter" type="xsd:gMonthDay"
           xdb:SQLType="TIMESTAMP WITH TIME ZONE"/>
値の最後にZを使用したUTCタイムゾーンの指定

XML Schemaでは、UTCタイムゾーンを表すために、タイムゾーン・コンポーネントにZを指定できます。最後にZが付く値をSQL TIMESTAMP WITH TIME ZONE列に格納すると、そのタイムゾーンは実質的に+00:00として格納されます。したがって、取得したタイムゾーン値の最後には、元のZではなく、+00:00が付いています。たとえば、入力XML文書の値が1973-02-12T13:44:32Zの場合、出力は1973-02-12T13:44:32.000000+00:00になります。

SQLへのcomplexTypeのマッピング

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:maintainOrderfalseに設定されている場合)になります。VARRAY値のデフォルトの記憶域はOrdered Collection Table(OCT)です。属性xdb:storeVarrayAsTablefalseに設定することによって、かわりにLOB記憶域を選択できます。

complexTypeのXML Schema宣言での属性の指定

グローバルな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>