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