[Oracle] XMLSchemaに基づいたXMLType列を含む表の作成方法 | Archive Redo Blog

Archive Redo Blog

DBエンジニアのあれこれ備忘録

XMLSchemaに基づいたXMLType列を含む表を作成する方法の基本的な例を以下にまとめます。
1.ディレクトリオブジェクトを作成する。
XMLSchemaやXML文書を置くディレクトリにアクセスするためにディレクトリオブジェクトを作成します。

CREATE DIRECTORY XDB_DIR AS 'C:\Oracle\XDB'
/

2.XMLSchemaを登録する。
DBMS_XMLSCHEMAパッケージのregisterSchemaプロシージャを実行し、XMLSchemaを登録します。

BEGIN
  DBMS_XMLSCHEMA.registerSchema(
    SCHEMAURL => 'http://xmlns.tekitouna.url.co.jp/xdb/test1.xsd',
    SCHEMADOC => bfilename('XDB_DIR','test1.xsd'),
    CSID => nls_charset_id('JA16SJIS'));
END;
/

SCHEMAURL:XMLSchemaを一意に識別するためのURLで、実在するURLである必要はありません。
SCHEMADOC:XMLSchemaの定義ファイルをBFILEで指定します。
CSID:XMLSchema定義ファイルの文字コードをIDで指定します。

C:\Oracle\XDB\test1.xsd
<xsd:schema xmlns="http://xmlns.tekitouna.url.co.jp/xdb/"
  targetNamespace="http://xmlns.tekitouna.url.co.jp/xdb/"
  xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:element name="TEST">
    <xsd:complexType>
      <xsd:sequence>
        <xsd:element ref="NAME" minOccurs="1" maxOccurs="1"/>
        <xsd:element ref="ADDRESS" minOccurs="0" maxOccurs="1"/>
      </xsd:sequence>
    </xsd:complexType>
  </xsd:element>
  <xsd:element name="NAME" type="xsd:string"/>
  <xsd:element name="ADDRESS" type="xsd:string"/>
</xsd:schema>

なお、登録したXMLSchemaを削除する場合は、DBMS_XMLSCHEMAパッケージのdeleteSchemaプロシージャを実行します。

BEGIN
  DBMS_XMLSCHEMA.deleteSchema(
    SCHEMAURL => 'http://xmlns.tekitouna.url.co.jp/xdb/test1.xsd',
    DELETE_OPTION => dbms_xmlschema.DELETE_CASCADE_FORCE);
END;
/

3.XMLType列を含む表を作成する。

XML文書を格納する列をXMLType型として表を定義します。


この時、同時にXMLType列の記憶域属性やXMLSchemaのURL、XML要素名なども指定します。


CREATE TABLE test1 ( ID NUMBER(10), TEST1_XML XMLType )
  XMLType COLUMN TEST1_XML
  XMLSchema "http://xmlns.tekitouna.url.co.jp/xdb/test1.xsd"
  ELEMENT "TEST"
/

XMLType COLUMN:XMLType列を指定します。
XMLSchema:あらかじめ登録済のXMLSchemaのURLを指定します。
ELEMENT:XML文書のルート要素を指定します。

4.XML文書を登録する。

XML文書を登録します。


ここではXMLType関数とBFILE関数を利用してXML文書ファイルから登録しています。


この時、登録するXML文書のルート要素には名前空間やXMLSchemaなどの情報が必要になります。

INSERT INTO TEST1 
  VALUES ( 1, XMLType( BFILENAME( 'XDB_DIR', 'test1.xml' ), nls_charset_id( 'JA16SJIS' ) ) )
/

C:\Oracle\XDB\test1.xml
<TEST xmlns="http://xmlns.tekitouna.url.co.jp/xdb/"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://xmlns.tekitouna.url.co.jp/xdb/ http://xmlns.tekitouna.url.co.jp/xdb/test1.xsd">
  <NAME>Scott</NAME>
  <ADDRESS>New York</ADDRESS>
</TEST>

このとき、トップノードにxmlnsやschemaLocationを記述していなければ

ORA-19007: スキーマ-は予想されたhttp://xmlns.tekitouna.url.co.jp/xdb/test1e.xsdと一致しません。

が発生します。



【関連エントリ】
[Oracle] XMLTypeへのXML文書の格納 2005/08/10
[Oracle] XMLSchemaに基づいたXMLType列を含む表の作成方法 2005/08/15
[Oracle] XMLSchema基づかないXMLType列を含む表の作成方法 2005/08/22
[Oracle] XMLを見やすく整形して出力する方法 2005/12/07