SQL文でのXMLの使用方法

この項では、XMLTypeデータをデータベースで使用する方法を説明します。

XMLType表

サンプル・スキーマoeには表warehousesが含まれ、この表にはXMLTypewarehouse_specが含まれます。warehouse_spec情報を持つ別の表を作成するとします。次の例は、CLOB列を1列のみ持つ非常に単純なXMLType表を作成します。

CREATE TABLE xwarehouses OF XMLTYPE
  XMLTYPE STORE AS CLOB;

このような表には、次の文に示すように、XMLType構文を使用してデータを挿入することができます。(この例で挿入されるデータは、サンプル表oe.warehouseswarehouse_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.warehouseswarehouse_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ビューを作成することもできます。

関連項目:

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";