SQL文でのXMLの使用方法
この項では、XMLTypeデータをデータベースで使用する方法を説明します。
                  
XMLType表
サンプル・スキーマoeには表warehousesが含まれ、この表にはXMLType列warehouse_specが含まれます。warehouse_spec情報を持つ別の表を作成するとします。次の例は、CLOB列を1列のみ持つ非常に単純なXMLType表を作成します。
                  
CREATE TABLE xwarehouses OF XMLTYPE XMLTYPE STORE AS CLOB;
このような表には、次の文に示すように、XMLType構文を使用してデータを挿入することができます。(この例で挿入されるデータは、サンプル表oe.warehousesのwarehouse_spec列にあるデータに対応します。warehouse_idは1です。) 
                  
INSERT INTO xwarehouses VALUES 
  (xmltype('<?xml version="1.0"?>
  <Warehouse>
    <WarehouseId>1</WarehouseId>
    <WarehouseName>Southlake, Texas</WarehouseName>
    <Building>Owned</Building>
    <Area>25000</Area>
    <Docks>2</Docks>
    <DockType>Rear load</DockType>
    <WaterAccess>true</WaterAccess>
    <RailAccess>N</RailAccess>
    <Parking>Street</Parking>
    <VClearance>10</VClearance>
  </Warehouse>'));関連項目:
XMLTypeおよびそのメンバー・メソッドの詳細は、『Oracle XML DB開発者ガイド』を参照してください。
                     
この表の問合せには、次の文を使用します。
SELECT e.getClobVal() FROM xwarehouses e;
CLOB列には、LOB列に対する制限がすべて適用されます。これらの制限事項を回避するには、XMLスキーマベースの表を作成します。XMLスキーマは、XML要素を対応するオブジェクト・リレーショナル・データにマップします。次の例は、XMLスキーマをローカルに登録します。XMLスキーマ(xwarhouses.xsd)には、xwarehouses表と同じ構造が反映されます。(XMLスキーマの宣言ではPL/SQLおよびDBMS_XMLSCHEMAパッケージが使用されています。例では、これらをイタリック体で示しています。)
                  
関連項目:
XMLスキーマの作成の詳細は、『Oracle XML DB開発者ガイド』を参照してください。
begin dbms_xmlschema.registerSchema( 'http://www.example.com/xwarehouses.xsd', '<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://www.example.com/xwarehouses.xsd" xmlns:who="http://www.example.com/xwarehouses.xsd" version="1.0"> <simpleType name="RentalType"> <restriction base="string"> <enumeration value="Rented"/> <enumeration value="Owned"/> </restriction> </simpleType> <simpleType name="ParkingType"> <restriction base="string"> <enumeration value="Street"/> <enumeration value="Lot"/> </restriction> </simpleType> <element name = "Warehouse"> <complexType> <sequence> <element name = "WarehouseId" type = "positiveInteger"/> <element name = "WarehouseName" type = "string"/> <element name = "Building" type = "who:RentalType"/> <element name = "Area" type = "positiveInteger"/> <element name = "Docks" type = "positiveInteger"/> <element name = "DockType" type = "string"/> <element name = "WaterAccess" type = "boolean"/> <element name = "RailAccess" type = "boolean"/> <element name = "Parking" type = "who:ParkingType"/> <element name = "VClearance" type = "positiveInteger"/> </sequence> </complexType> </element> </schema>', TRUE, TRUE, FALSE, FALSE); end; /
これで、次の例に示すように、XMLスキーマベースの表を作成できます。
CREATE TABLE xwarehouses OF XMLTYPE XMLSCHEMA "http://www.example.com/xwarehouses.xsd" ELEMENT "Warehouse";
デフォルトでは、この表はオブジェクト・リレーショナル表として格納されます。そのため、次の例に示すように、この表にデータを挿入できます。(この例で挿入されるデータは、サンプル表oe.warehousesのwarehouse_spec列にあるデータに対応します。warehouse_idは1です。)
                  
INSERT INTO xwarehouses VALUES(   xmltype.createxml('<?xml version="1.0"?>
   <who:Warehouse xmlns:who="http://www.example.com/xwarehouses.xsd" 
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
   xsi:schemaLocation="http://www.example.com/xwarehouses.xsd
   http://www.example.com/xwarehouses.xsd">
      <WarehouseId>1</WarehouseId>
      <WarehouseName>Southlake, Texas</WarehouseName>
      <Building>Owned</Building>
      <Area>25000</Area>
      <Docks>2</Docks>
      <DockType>Rear load</DockType>
      <WaterAccess>true</WaterAccess>
      <RailAccess>false</RailAccess>
      <Parking>Street</Parking>
      <VClearance>10</VClearance>
      </who:Warehouse>'));
...XMLスキーマベースの表には制約を定義できます。その場合は、XML要素Warehouse内の適切な属性を参照するように、XMLDATA疑似列を使用します。
                  
ALTER TABLE xwarehouses ADD (PRIMARY KEY(XMLDATA."WarehouseId"));
xwarehousesのデータはオブジェクト・リレーショナルに格納されるため、可能な場合に基礎となる記憶域を参照できるように、このXMLType表への問合せが書き換えられます。そのため、次の問合せでは、前述の例の主キー制約によって作成された索引を使用します。 
                  
SELECT * FROM xwarehouses x WHERE EXISTSNODE(VALUE(x), '/Warehouse[WarehouseId="1"]', 'xmlns:who="http://www.example.com/xwarehouses.xsd"') = 1; SELECT * FROM xwarehouses x WHERE EXTRACTVALUE(VALUE(x), '/Warehouse/WarehouseId', 'xmlns:who="http://www.example.com/xwarehouses.xsd"') = 1;
XMLスキーマベースの表に索引を明示的に作成すると、後続の問合せのパフォーマンスが大幅に向上します。XMLType表にオブジェクト・リレーショナル・ビューを作成することも、オブジェクト・リレーショナル表にXMLTypeビューを作成することもできます。
                  
関連項目:
- 
                           
XMLDATA疑似列の詳細は、「XMLDATA疑似列」を参照してください。 
XMLType列
サンプル表oe.warehousesは、XMLType型のwarehouse_spec列を使用して作成されました。この項の例は、2つのタイプの記憶域を使用して、簡略化したoe.warehouses表を作成します。
                  
最初の例は、CLOBとして格納されたXMLType表を持つ表を作成します。この表ではXMLスキーマが必要ないため、コンテンツ構造は事前に定義しません。
                  
CREATE TABLE xwarehouses (
   warehouse_id        NUMBER,
   warehouse_spec      XMLTYPE)
   XMLTYPE warehouse_spec STORE AS CLOB
   (TABLESPACE example
    STORAGE (INITIAL 6144)
    CHUNK 4000
    NOCACHE LOGGING);
次の例でも前述の例とほぼ同じ表を作成しますが、指定されたXMLスキーマによって構造が決められているオブジェクト・リレーショナルXMLType列に、XMLTypeデータが格納されます。
                  
CREATE TABLE xwarehouses (
   warehouse_id    NUMBER,
   warehouse_spec  XMLTYPE)
   XMLTYPE warehouse_spec STORE AS OBJECT RELATIONAL
      XMLSCHEMA "http://www.example.com/xwarehouses.xsd"
      ELEMENT "Warehouse";