ヘッダーをスキップ
Oracle XML DB開発者ガイド
11gリリース1(11.1)
E05669-02
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

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

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

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

注意:

使用されているURL(http://xmlns.oracle.com/xdb/documentation/purchaseOrder.xsd)は、データベース内の登録済スキーマを一意に識別する名前です。このURLが、XML Schema文書がある場所を指している必要はありません。また、XML Schemaのターゲット名前空間は、XML Schemaの場所を示すURLとは異なる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エンティティを取得できます。ただし、Oracle XML DBによってDTDの中の構造情報および型情報は使用されず、エンティティのみが使用される情報です。

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のサポートが提供されます。

XML Schemaを使用する理由

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の長所を活用できます。

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.xsdというパスで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の主なプロシージャは、次のとおりです。

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

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

  • OPTIONS: スキーマの登録方法を指定するオプション。最も重要なオプションは、REGISTER_BINARYXMLであり、バイナリXML記憶域にXML Schemaが使用されることを示します。他のオプションには、REGISTER_AUTO_OOLREGISTER_NT_AS_IOTなどがあります。


    注意:

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

例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の登録時には、スキーマを登録しても、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表および列を作成できます。

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の一部として作成されます。

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データの場合、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登録者のデータベース・スキーマに作成されます。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 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に依存します。

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

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

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

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

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

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: 依存関係が検知されてもエラーを表示しません。そのかわり、各依存関係に無効のマークを付けます。バイナリ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-7DELETE_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を参照しないように変換されていることを確認してください。そうしない場合、消去後にそれらの文書をデコードできなくなります。

XMLTypeのXML Schema関連メソッド

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

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

XMLTypeのメソッド 説明
isSchemaBased()

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

getSchemaURL()
getRootElement()
getNamespace()

XMLTypeインスタンスに対するXML Schema URL、ルート要素名および名前空間。メソッドgetRootElement()は、XML Schemaに基づくメタデータ、またはXML Schemaに基づかないメタデータとともに使用できます。getRootElement()は、その名前に反して、ルート要素を戻さずに名前要素を戻すことに注意してください。

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

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

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


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

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

XML Schemaを登録する場合、PL/SQLパッケージDBMS_XMLSCHEMAはOracle XML DBリポジトリに対応するリソースを追加します。XML Schema URLによってリポジトリのXML Schemaリソースのパス名が決定されます(さらにregisterSchemaSCHEMAURLパラメータに関連付けられます)。


注意:

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から導出されます。

例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を指定できます。

グローバル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)の再現性とは、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の内部でのみ使用する属性です。この列に直接アクセスしたり、操作しないでください。

他の属性に格納できない情報はすべて、この位置指定ディスクリプタ属性によって格納されます。Oracle XML DBに格納されたすべてのXML文書のDOM再現性を保証するために、PD情報が使用されます。このような情報には、たとえば注文情報、コメント、処理命令、名前空間の接頭辞などがあります。

DOM再現性が不要な場合は、型レベルでmaintainDOM = "false"属性を設定し、XML Schema定義でSYS_XDBPD$を省略できます。


注意:

このマニュアルの多くの例では、簡略化のためSYS_XDBPD$属性を省略しています。ただし、この属性は、XML Schemaの登録処理によって生成されたすべてのSQLオブジェクト型に、位置指定ディスクリプタ(PD)列として常に存在します。

通常は、PD属性を省略しないことをお薦めします。PD列が存在しない場合、コメント、処理命令などの情報が失われる可能性があるためです。


XML変換

Oracle XML DBリポジトリ内のセキュリティ・オブジェクトをXMLTypeインスタンスとして格納できます。これらのインスタンスには、構造化記憶域モデル(オブジェクト・リレーショナル記憶域)、非構造化記憶域モデル(CLOB)、およびバイナリXML記憶域モデルから任意のモデルを使用できます。これらのセキュリティ・オブジェクトには、様々な言語で検索または表示が可能な、変換が必要な文字列も含まれています。これらの文字列を変換したものは、元のドキュメントと関連付ける必要があるため、Oracle XML DBリポジトリに元の文字列とともに格納されています。ユーザーの言語設定に応じて、これらの文字列を取得および操作できます。


注意:

オブジェクト・リレーショナル形式で格納された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の登録時に、プロシージャregisterSchemaはXML Schemaが前述の制限を満たすかどうかをチェックします。

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

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

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

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

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

この項では、変換を指定する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:translatetrueに設定します。これは、xdb:maxOccurs1であるため、単一値要素です。例6-12は、属性xdb:translatetrueに設定されている新規の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:maxOccursunboundedに設定します。ただし、xdb:translateは、各要素を一意に識別する識別子属性がないかぎり、複数値要素用にtrueに設定できません。例6-14は、識別子属性idtitle要素に対して設定されている新規のスキーマを説明しています。

例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:langsession languageに設定され、属性xdb:srclangtrueに設定されています。

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

      例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:srclangtrueの言語と同じです。この構文の説明の中で、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述語を持つ索引を作成する必要があります。

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

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

  • 更新: 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に制限されます。

図6-1に、XMLType表を作成するための構文を示します。


関連項目:

CREATE TABLEの詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

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

例6-20 XML Schemaに基づくXMLType表および列の作成

この例は、CREATE TABLE文を示しています。最初の文は、XMLTypepurchaseorder_as_tableを作成します。2番目の文は、XMLTypexml_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に基づくデータのXMLType記憶域オプションの指定

XML Schemaを参照するXMLインスタンス・ドキュメントを格納する表を作成する場合、使用する記憶域オプションを指定できます。デフォルトの記憶域モデルは、構造化記憶域です。構造化記憶域でなくバイナリXML記憶域または非構造化記憶域を使用するには、CREATE TABLE文でSTORE AS句を使用します。

この項では、XML Schemaに基づくデータのための記憶域オプションを指定する際に必要な知識について説明します。

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

バイナリ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 TABLEALLOW NONSCHEMAとともに使用するが、ALLOW ANYSCHEMAとともには使用しない場合は、XML Schemaに基づく文書を含むすべての文書が、XML Schemaに基づかないエンコーディングを使用してエンコードされます。あとから同一の表でALTER TABLEとともにALLOW ANYSCHEMAを使用する場合、ALTER TABLE操作より前に格納された文書のエンコーディングには影響しません。そのような文書はすべて、文書がXML Schemaを参照しているかどうかに関係なく、XML Schemaに基づかないエンコーディングで引き続きエンコードされます。ALTER TABLE操作より後で表に挿入される、XML Schemaに基づくドキュメントのみが、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記憶域パラメータを追加できます。

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

構造化記憶域は、デフォルトの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句を指定する方法も示しています。

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

構造化記憶域を使用してXMLデータを格納する場合は、XML文書内で1回のみ出現する要素および属性に対して、標準的なリレーショナル制約を指定できます。例6-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データの構造化記憶域について、registerSchemaによって作成された表、オブジェクトおよびオブジェクト属性の名前が、あらゆるアプリケーション・ネーミング標準に準拠した一般的な名前であることを保証するため。この場合は、GENTYPESまたはGENTABLESTRUEに設定します。

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

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

  • (文書が相互に関連する再帰的な)XPath問合せの場合、つまり、特定のextractextractValueおよびexistsNodeアプリケーションでXPath式が再帰的なXMLデータをターゲットにしている場合は、XPathリライトが可能になります。XPathリライトを利用できるのは、XMLデータの構造化記憶域の場合だけです。

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

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

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

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

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

  • maintainDOM: 指定されているcomplexType定義のDOM再現性を維持する必要があるかどうかを判断するために使用します。

  • storeVarrayAsTable: XML Schemaのルート要素を指定します。すべてのコレクションをOrdered Collection Table(OCT)として格納するために使用します。maxOccurs > 1で指定されている各要素に対して、1つのOCTが作成されます。OCTは、システム生成の名前で作成されます。storeVarrayAsTableのデフォルト値はtrueです。

これらの属性のいずれにも、値を指定する必要はありません。Oracle XML DBにより、デフォルトで、XML Schemaの登録プロセス中に適切な値が提供されます。ただし、構造化記憶域を使用する場合、少なくとも最上位のSQL型の名前を指定し、後で参照できるようにすることをお薦めします。

XML Schema注釈の例

例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_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注釈

表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

表6-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記憶域に適用されます。

csx:encodingType

任意のバイナリXMLエンコーディング型脚注1

XML Schemaデータ型に基づきます。

この要素または属性のノード値をエンコードするために使用されるエンコーディング型を指定します。これを使用できるのは、要素xsd:attributexsd:simpleTypeおよびxsd:elementsimpleTypeまたはsimpleContentに基づいている要素のみ)の内部だけです。バイナリ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データ型脚注2。ただし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データ型のバイナリXMLエンコーディング型へのマッピング」を参照してください。

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

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

属性 デフォルト 説明

csx:encodingType

任意のバイナリXMLエンコーディング型脚注1

XML Schemaデータ型に基づきます。

この要素または属性のノード値をエンコードするために使用されるエンコーディング型。これを使用できるのは、要素xsd:attributexsd:simpleTypeおよびxsd:elementsimpleTypeまたはsimpleContentに基づいている要素のみ)の内部だけです。

xdb:maintainDOM

true | false

TRUE

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

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

xdb:SQLSchema

任意のSQLユーザー名

XML Schemaを登録するユーザー

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

xdb:SQLType

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

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

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


脚注1 「XML Schemaデータ型のバイナリXMLエンコーディング型へのマッピング」を参照してください。

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

表6-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の問合せによる注釈の取得

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

XML Schemaに準拠するXMLデータの型は、XML Schemaデータ型により決まります。このXMLデータがOracle XML DBに格納される場合、その記憶域データ型はデフォルトのマッピングを使用して(およびオプションで、XML Schema注釈を使用して指定したマッピング情報を使用して)、XML Schemaデータ型から導かれます。

記憶域に対して使用するデータ型を指定しない場合、Oracle XML DBは登録時に、デフォルトのマッピングを使用して適切にXML Schemaに注釈を付けます。こうすると、登録されたXML Schemaに、データ型注釈の完全なセットが含まれます。

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

図6-2の説明が続きます
「図6-2 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へのマッピングの例

例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属性データ型の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へのマッピングの詳細は、第8章「XML Schemaの格納と問合せ: 高度」を参照してください。

SQLへのsimpleTypeのマッピング

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

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

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

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

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

string

n

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

CHARCLOB

string

-

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

CHARCLOB


表6-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


表6-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


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

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

dateTime

TIMESTAMP

TIMESTAMP WITH TIME ZONEDATE

time

TIMESTAMP

TIMESTAMP WITH TIME ZONEDATE

date

DATE

TIMESTAMP WITH TIME ZONE

gDay

DATE

TIMESTAMP WITH TIME ZONE

gMonth

DATE

TIMESTAMP WITH TIME ZONE

gYear

DATE

TIMESTAMP WITH TIME ZONE

gYearMonth

DATE

TIMESTAMP WITH TIME ZONE

gMonthDay

DATE

TIMESTAMP WITH TIME ZONE

duration

VARCHAR2(4000)

なし


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

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

boolean

RAW(1)

VARCHAR2

language(string)

VARCHAR2(4000)

CLOBCHAR

NMTOKEN(string)

VARCHAR2(4000)

CLOBCHAR

NMTOKENS(string)

VARCHAR2(4000)

CLOBCHAR

Name(string)

VARCHAR2(4000)

CLOBCHAR

NCName(string)

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では、属性SQLTypeの値としてNCHARNVARCHARおよびNCLOBはサポートされません。要素の型に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が付く値を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値(デフォルト、推奨)または順序付けられていない表(属性maintainOrderfalseに設定されている場合)になります。VARRAY値のデフォルトの記憶域はOrdered Collections Table(OCT)です。属性storeAsLobtrueに設定することによって、かわりに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>

XML Schemaデータ型のバイナリXMLエンコーディング型へのマッピング

この項では、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エンコーディング型 説明

string

UTF-8文字データ

binary

バイナリ・データ

boolean

trueは1、falseは0(1バイト)

これはXML Schemaに対して常にtrueまたはfalseとデコードされます。1または0となることはありません。

int

符号付き、2の補数、ビッグ・エンディアンの整数(1、2、4、8バイトのいずれか)

unsigned-int

2の補数、ビッグ・エンディアンの整数(1、2、4、8バイトのいずれか)

float

IEEE-754浮動小数点数(4または8バイト)

oranum

Oracle内部数値表記(最大22バイト)

1.0 x 10 -130〜1.0 x 10 126の数値最大精度: 38桁。最大スケール: -84〜127。

oradate

グレゴリオ暦日付のOracle内部形式(7バイト)

小数秒なし。タイムゾーン情報なし。

orats

タイムゾーン情報を持つグレゴリオ暦日付のOracle内部形式(タイムスタンプ)

小数秒の1〜9桁。本来Zとして指定され、oratsを使用して格納されているXML Schemaタイムゾーン・コンポーネントは、+00:00としてXML Schemaにデコードされます。

epoch

1970年1月1日からの秒数(4または8バイトの符号付きバイナリ)

小数秒なし。タイムゾーン情報なし。

epochtz

epochと同じ。ただしGMTからの分数が後続(4または8バイトの符号付きバイナリおよび後続する2バイトの符号付き数値)

本来Zとして指定され、epochtzを使用して格納されているXML Schemaタイムゾーン・コンポーネントは、+00:00としてXML Schemaにデコードされます。

enum

符号なし整数。0から始まり、XML Schemaで定義された桁で、可能な列挙値ごとに1ずつ増加します。

qname

トークンIDと後続する接頭辞ID(4または8バイトおよび後続する2バイト)


表6-12 XML Schemaデータ型のバイナリXMLエンコーディング型へのマッピング

XML Schema型 バイナリXMLエンコーディング型 互換性のあるエンコーディング型

string

string

なし

hexBinary

binary

string

base64binary

binary

string

float

float

string

double

float

string

decimal

oranum

string

integer

oranum

string

nonNegativeInteger

oranum

string

positiveInteger

oranum

string

nonPositiveInteger

oranum

string

negativeInteger

oranum

string

long

int

oranumstring

unsignedLong

unsigned-int

oranumstring

int

int

oranumstring

unsignedInt

unsigned-int

oranumstring

short

int

oranumstring

unsignedShort

unsigned-int

oranumstring

byte

int

oranumstring

unsignedByte

unsigned-int

oranumstring

dateTime

orats

oradateepochepochtzstring

time

orats

oradateepochepochtzstring

date

orats

oradateepochepochtzstring

gDay

orats

oradateepochepochtzstring

gMonth

orats

oradateepochepochtzstring

gYear

orats

oradateepochepochtzstring

gYearMonth

orats

oradateepochepochtzstring

gMonthDay

orats

oradateepochepochtzstring

duration

string

なし

boolean

boolean

string

language

string

なし

NMTOKEN

string

なし

NMTOKENS

string

なし

Name

string

なし

NCName

string

なし

ID

string

なし

IDREF

string

なし

IDREFS

string

なし

ENTITY

string

なし

ENTITITES

string

なし

NOTATION

string

なし

anyURI

string

なし

anyType

内部エンコーディング脚注1

なし

anySimpleType

string

なし

QName

qname

string

normalizedString

string

なし

token

string

なし


脚注1 XML SchemaタイプanyTypeにはエンコーディング型を指定できません。