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