W3Cで勧告されているXMLスキーマは、XMLスキーマが定義されている場所を示すロケーション情報(以下、スキーマ・ロケーションと呼びます)を記述することができます。XMLデータにはその妥当性検証に使用するためのXMLスキーマを、XMLスキーマにはincludeやimportなどにより参照するXMLスキーマを取得するためにスキーマ・ロケーションを指定することができます。W3Cでは、これらのスキーマ・ロケーションはあくまでもヒントであり、かつ、XMLスキーマを処理するプログラムはスキーマ・ロケーションを使用しなくてもよい規定となっています。
そこでDB2では、XMLデータを妥当性検証する際、スキーマ・ロケーションを使用してXMLスキーマを取得する方法のほかに、リレーショナルIDと呼ぶユニークなIDを使用してXMLスキーマを取得する方法を提供しています(図1)。
図1. DB2によるXMLスキーマの管理(XMLスキーマ・リポジトリー)
XMLスキーマにはさまざまな種類があります。この記事では、以下のケースを取り上げ、具体的な例を挙げて、XMLスキーマの登録方法、XMLデータの妥当性検証方法、妥当性検証に利用したXMLスキーマの取得方法などについて説明します。
- 名前空間なしXMLスキーマ
例: リスト1のcustomer1.xsd (XMLスキーマ), リスト7のcustomer1.xml (XMLデータ) - 名前空間なしXMLスキーマ (別の名前空間なしXMLスキーマを参照)
例: リスト2とリスト3のcustomer2.xsd, company2.xsd (XMLスキーマ), リスト9のcustomer2.xml (XMLデータ) - 名前空間ありXMLスキーマ
例: リスト4のcustomer3.xsd (XMLスキーマ), リスト10のcustomer3.xml (XMLデータ) - 名前空間ありXMLスキーマ (異なる名前空間を持つXMLスキーマを参照)
例: リスト5とリスト6のcustomer4.xsd, company4.xsd (XMLスキーマ), リスト11のcustomer4.xml (XMLデータ)
DB2におけるXMLスキーマの登録は以下のステップで行います。
- 主となるXMLスキーマの登録(REGISTER XMLSCHEMAコマンド)
- includeやimportしているXMLスキーマの追加登録(ADD XMLSCHEMAコマンド)
(*) 1のオプションを利用して複数のXMLスキーマを登録することもできます。 - 登録したXMLスキーマの検証と使用可能化(COMPLETE XMLSCHEMAコマンド)
以下、いくつかのXMLスキーマを例に説明します。
customer1.xsdは、名前空間なしXMLスキーマの例です。
リスト 1. customer1.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema> |
XMLスキーマをDB2に登録する際、そのXMLスキーマに対応するリレーショナルIDとスキーマ・ロケーションを指定します。リレーショナルIDは、DB2の表名などと同様、スキーマ名も保持します。上記のリレーショナルIDをSAMPLE.CUSTOMER1、スキーマ・ロケーションをcustomer1.xsd とすると、以下のDB2のコマンドでXMLスキーマを登録することができます。(/work/customer1.xsdファイルにこのXMLスキーマが定義されていると想定します。以降、必要なファイルはすべて/workディレクトリ下に置かれていると想定します。)
REGISTER XMLSCHEMA 'customer1.xsd' FROM '/work/customer1.xsd' AS SAMPLE.CUSTOMER1; |
続いて、以下のコマンドにより、登録したXMLスキーマを検証し使用可能状態にします。
COMPLETE XMLSCHEMA SAMPLE.CUSTOMER1; |
ちなみに、登録したXMLスキーマを削除するには、以下のコマンドを発行します。
DROP XSROBJECT SAMPLE.CUSTOMER1; |
名前空間なしXMLスキーマ (別の名前空間なしXMLスキーマを参照)
参照元も参照先も名前空間なしの場合、あるいは、同じ名前空間を持つ場合、includeエレメントを使用して参照先のスキーマ・ロケーションを指定します。DB2では、参照先のXMLスキーマを参照元と同じスキーマ・ロケーション/リレーショナルIDに追加登録して保持しますが、それらのXMLスキーマをリポジトリー内部で区別するためにincludeエレメントで指定されたスキーマ・ロケーションを指定して追加登録します。つまり、DB2では、XMLデータの妥当性検証で使用可能なスキーマ・ロケーションとリレーショナルIDのほかに、XMLスキーマ・リポジトリー内部で使用するスキーマ・ロケーションを管理します(図2)。
図2. XMLスキーマ・リポジトリー内部で管理されるスキーマ・ロケーション
customer2.xsdは、名前空間なしXMLスキーマで、別の名前空間なしXMLスキーマcompany2.xsdを参照しています。
リスト 2. customer2.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:include schemaLocation="company2.xsd"/>
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element ref="company-name"/>
<xs:element ref="company-address"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema> |
リスト 3. company2.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="company-name" type="xs:string"/>
<xs:element name="company-address" type="xs:string"/>
</xs:schema> |
上記2つのXMLスキーマが保持されるリレーショナルIDをSAMPLE.CUSTOMER2、スキーマ・ロケーションをcustomer2.xsdとします。
まず、最初のXMLスキーマcustomer2.xsdを以下のコマンドで登録します。
REGISTER XMLSCHEMA 'customer2.xsd' FROM '/work/customer2.xsd' AS SAMPLE.CUSTOMER2; |
次にXMLスキーマcompany2.xsdを追加登録します。追加の際、XMLスキーマ・リポジトリー内部で管理するためのスキーマ・ロケーションとして、includeエレメントのschemaLocation属性で指定されたスキーマ・ロケーションを指定します(この例ではcompany2.xsd)。DB2は、XMLスキーマの検証時、includeされたXMLスキーマを取得する際、ここで登録したスキーマ・ロケーションから該当するXMLスキーマを特定します。
ADD XMLSCHEMA DOCUMENT TO SAMPLE.CUSTOMER2 ADD 'company2.xsd' FROM '/work/company2.xsd'; |
最後に、登録したXMLスキーマを検証し使用可能状態とします。
COMPLETE XMLSCHEMA SAMPLE.CUSTOMER2; |
customer3.xsdは、"http://www.sample.com/customer" という名前空間に属すエレメントを定義しているXMLスキーマの例です。
リスト 4. customer3.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/customer"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema> |
XMLスキーマの登録は、名前空間なしの場合と同様です。リレーショナルIDをSAMPLE.CUSTOMER3、スキーマ・ロケーションをcustomer3.xsdとすると、以下のコマンドで登録します。
REGISTER XMLSCHEMA 'customer3.xsd' FROM '/work/customer3.xsd' AS SAMPLE.CUSTOMER3; |
以下のコマンドで登録したXMLスキーマの検証および使用可能化を行います。
COMPLETE XMLSCHEMA SAMPLE.CUSTOMER3; |
名前空間ありXMLスキーマ (異なる名前空間を持つXMLスキーマを参照)
XMLスキーマから異なる名前空間を持つXMLスキーマを参照する場合、importエレメントを使用して参照先の名前空間とスキーマ・ロケーションを指定します。スキーマ・ロケーションは、XMLスキーマを処理するプログラムが使用しなければ省略可能です。DB2では、importエレメントに指定されたスキーマ・ロケーションを参照せず、名前空間のみを使用してXMLスキーマを特定しますので、importエレメントに指定可能な参照先のスキーマ・ロケーションは省略可能です。
customer4.xsdは、"http://www.sample.com/customer" という名前空間に属すエレメントを定義しており、"http://www.sample.com/company"という名前空間に属すエレメントを保持するcompany4.xsdを参照しているXMLスキーマの例です。customer4.xsdのimportエレメントのschemaLocation属性は省略可能です。
リスト 5. customer4.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/customer"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:com="http://www.sample.com/company"
elementFormDefault="qualified">
<xs:import namespace="http://www.sample.com/company" schemaLocation="company4.xsd"/>
<xs:element name="customer">
<xs:complexType>
<xs:sequence>
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
<xs:element name="phone" type="xs:string"/>
<xs:element name="email" type="xs:string"/>
<xs:element ref="com:name"/>
<xs:element ref="com:address"/>
</xs:sequence>
<xs:attribute name="type" type="xs:string"/>
</xs:complexType>
</xs:element>
</xs:schema> |
リスト 6. company4.xsd (XMLスキーマ)
<?xml version="1.0"?>
<xs:schema targetNamespace="http://www.sample.com/company"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
elementFormDefault="qualified">
<xs:element name="name" type="xs:string"/>
<xs:element name="address" type="xs:string"/>
</xs:schema> |
上記2つのXMLスキーマが保持されるリレーショナルIDをSAMPLE.CUSTOMER4、スキーマ・ロケーションをcustomer4.xsdとします。
まず、最初のXMLスキーマcustomer4.xsdを以下のコマンドで登録します。
REGISTER XMLSCHEMA 'customer4.xsd' FROM '/work/customer4.xsd' AS SAMPLE.CUSTOMER4; |
次にXMLスキーマcompany4.xsdを追加します。追加の際、XMLスキーマ・リポジトリー内部で管理するためのスキーマ・ロケーションを指定します。異なる名前空間のXMLスキーマを参照する際、名前空間でXMLスキーマを特定しますので、スキーマ・ロケーションは何でも構いません。この例では、管理が容易になるように、importエレメントのschemaLocation属性を省略せず、かつ、その名前を使用してcompany4.xsdを追加登録しています。
ADD XMLSCHEMA DOCUMENT TO SAMPLE.CUSTOMER4 ADD 'company4.xsd' FROM '/work/company4.xsd'; |
最後に、登録したXMLスキーマを検証し使用可能状態とします。
COMPLETE XMLSCHEMA SAMPLE.CUSTOMER4; |
上記で定義したXMLスキーマを用いてXMLデータを妥当性検証し、以下のテーブルのXMLデータタイプ(XMLDATAカラム)に挿入する例を述べます。
CREATE TABLE T1 (ID INT NOT NULL PRIMARY KEY, XMLDATA XML NOT NULL); |
SQL文でXMLデータの妥当性検証を行う場合、XMLVALIDATE関数を使用します。また、IMPORTコマンドでインポートするXMLデータの妥当性検証を行う場合、XMLVALIDATEオプションを使用します。
リスト7のcustomer1.xmlは、customer1.xsdに適合するXMLデータの例です。名前空間を持たないXMLスキーマを参照する場合、名前空間 "http://www.w3.org/2001/XMLSchema-instance" のnoNamespaceSchemaLocation属性を使用します。
リスト 7. customer1.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="customer1.xsd"
type="1">
<name>cust1</name>
<address>address1</address>
<phone>11-2222-3333</phone>
<email>cust1@sample.com</email>
</customer> |
XMLVALIDATE関数にはいくつかのオプションがありますが、省略するとXMLデータに定義されたスキーマ・ロケーション(上記の場合、xsi:noNamespaceSchemaLocation属性の値)と同じスキーマ・ロケーションのXMLスキーマを使用して妥当性検証が行われます。
INSERT INTO T1(ID, XMLDATA) VALUES (1,
XMLVALIDATE(XMLPARSE(DOCUMENT
'<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="customer1.xsd"
type="1">
<name>cust1</name>
<address>address1</address>
<phone>11-2222-3333</phone>
<email>cust1@sample.com</email>
</customer>'))
); |
XMLVALIDATE関数に、"ACCORDING TO XMLSCHEMA ID リレーショナルID" を付加すると、XMLデータに定義されたスキーマ・ロケーションは無視され、このリレーショナルIDと同じリレーショナルIDのXMLスキーマを使用して妥当性検証が行われます。
上記XMLデータは、SAMPLE.CUSTOMER1に適合しますが、SAMPLE.CUSTOMER2で妥当性検証を行う場合、以下のSQL文を発行します。
INSERT INTO T1(ID, XMLDATA) VALUES (11,
XMLVALIDATE(XMLPARSE(DOCUMENT
'<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="customer1.xsd"
type="1">
<name>cust1</name>
<address>address1</address>
<phone>11-2222-3333</phone>
<email>cust1@sample.com</email>
</customer>') ACCORDING TO XMLSCHEMA ID SAMPLE.CUSTOMER2)
); |
結果として、このXMLデータはSAMPLE.CUSTOMER2には適合しないため、以下のエラーが返されます。
SQL16205N XML 文書に含まれる要素の数が、内容モデル "((name,address,phone,email,company-name),company-address)" と突き合わせるには少なすぎます。 SQLSTATE=2200M |
このように、リレーショナルIDを使用することにより、XMLデータを変更することなく、さまざまなXMLスキーマと妥当性検証することができます。
IMPORTコマンドの場合、XMLVALIDATEのオプションとしていくつかありますが、"XMLVALIDATE USING SCHEMALOCATION HINTS" を指定するとスキーマ・ロケーションが使用され、"XMLVALIDATE USING SCHEMA リレーショナルID" を指定するとリレーショナルIDが使用されます。 T1テーブルのIDカラムに111, XMLDATAカラムにcustomer1.xmlファイルに書かれたXMLデータを挿入するために以下のcustomer1.delファイルを作成します。
リスト 8. customer1.del
111, "<XDS FIL='customer1.xml'/>" |
スキーマ・ロケーションを使用してXMLスキーマを特定してXMLデータの妥当性検証を行うためには、以下のIMPORTコマンドを発行します。
IMPORT FROM /work/customer1.del of del XML FROM /work XMLVALIDATE USING SCHEMALOCATION HINTS INSERT INTO T1; |
リレーショナルIDを使用してXMLスキーマを特定してXMLデータの妥当性検証を行うためには、以下のIMPORTコマンドを発行します。
IMPORT FROM /work/customer1.del of del XML FROM /work XMLVALIDATE USING SCHEMA SAMPLE.CUSTOMER1 INSERT INTO T1; |
名前空間なしXMLスキーマ (別の名前空間なしXMLスキーマを参照)
リスト9のcustomer2.xmlは、customer2.xsdに適合するXMLデータの例です。company-nameエレメントとcompany-addressエレメントは、includeで参照しているXMLスキーマcompany2.xsdに定義されているものです。
このXMLデータの妥当性検証も上記と同様なやり方で行うことができます。
リスト 9. customer2.xml
<?xml version="1.0"?>
<customer xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="customer2.xsd"
type="2">
<name>cust2</name>
<address>address2</address>
<phone>11-2222-3333</phone>
<email>cust2@sample.com</email>
<company-name>company1</company-name>
<company-address>company-address1</company-address>
</customer> |
リスト10のcustomer3.xmlは、customer3.xsdに適合するXMLデータの例です。名前空間を持つXMLスキーマを参照する際は、名前空間 "http://www.w3.org/2001/XMLSchema-instance" のschemaLocation属性を使用し、その値として名前空間とスキーマ・ロケーションを指定します。
このXMLデータの妥当性検証も上記と同様なやり方で行うことができます。
リスト 10. customer3.xml
<?xml version="1.0"?>
<customer xmlns="http://www.sample.com/customer"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sample.com/customer customer3.xsd"
type="3">
<name>cust3</name>
<address>address3</address>
<phone>11-2222-3333</phone>
<email>cust3@sample.com</email>
</customer> |
名前空間ありXMLスキーマ (異なる名前空間を持つXMLスキーマを参照)
リスト11のcustomer4.xmlは、customer4.xsdに適合するXMLデータの例です(すべてのエレメントの名前空間を明示的に記述しています)。複数の名前空間を持つ複数のXMLスキーマを参照できるように、名前空間 "http://www.w3.org/2001/XMLSchema-instance" のschemaLocation属性の値には、複数の名前空間とスキーマ・ロケーションのペアを指定することができます。
スキーマ・ロケーションを利用してXMLデータの妥当性検証を行う場合、最初のペアから順にXMLスキーマが特定されます。この例では、最初のペアとして、名前空間 "http://www.sample.com/customer" のスキーマ・ロケーションcustomer4.xsdが定義されています。このXMLスキーマの定義には、名前空間 "http://www.sample.com/company" がimportされていますので、その名前空間の定義も特定されます。次のペアとして、名前空間 "http://www.sample.com/company" のスキーマ・ロケーションが定義されていますが、既に特定されているため、この情報は無視されます。したがって、下記xsi:schemaLocation属性の値は、"http://www.sample.com/customer customer4.xsd"で十分です。
このXMLデータの妥当性検証も上記と同様なやり方で行うことができます。
リスト11. customer4.xml
<?xml version="1.0"?>
<cust:customer xmlns:cust="http://www.sample.com/customer"
xmlns:com="http://www.sample.com/company"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sample.com/customer customer4.xsd
http://www.sample.com/company company4.xsd"
type="4">
<cust:name>cust4</cust:name>
<cust:address>address4</cust:address>
<cust:phone>11-2222-3333</cust:phone>
<cust:email>cust4@sample.com</cust:email>
<com:name>company4</com:name>
<com:address>company-address4</com:address>
</cust:customer> |
XMLスキーマの登録情報とXMLデータの妥当性検証情報の参照
登録されたXMLスキーマのリレーショナルID、スキーマ・ロケーション、そのステータスを参照するには以下のSQL文を発行します。
SELECT OBJECTID,OBJECTSCHEMA,OBJECTNAME,SCHEMALOCATION,STATUS FROM SYSCAT.XSROBJECTS; |
SYSCAT.XSROBJECTSテーブルのOBJECTIDは、XMLスキーマを登録する毎に新しいIDが割り振られます。STATUSはXMLスキーマの状態を示します(値Cは使用可能状態を意味します)。
上記で定義したXMLスキーマをすべて登録すると、以下の結果が得られます。
db2 => SELECT OBJECTID,
SUBSTR(OBJECTSCHEMA,1,16) OBJECTSCHEMA,
SUBSTR(OBJECTNAME,1,16) OBJECTNAME,
SUBSTR(SCHEMALOCATION,1,16) SCHEMALOCATION,
STATUS
FROM SYSCAT.XSROBJECTS;
OBJECTID OBJECTSCHEMA OBJECTNAME SCHEMALOCATION STATUS
-------------------- ---------------- ---------------- ---------------- ------
4785074604091136 SAMPLE CUSTOMER1 customer1.xsd C
6755399441065728 SAMPLE CUSTOMER2 customer2.xsd C
7881299347908352 SAMPLE CUSTOMER3 customer3.xsd C
8725724278040320 SAMPLE CUSTOMER4 customer4.xsd C
4 レコードが選択されました。 |
関連するテーブルとしてSYSCAT.XSROBJECTCOMPONENTSテーブルがあります。そのテーブルでは、それぞれのリレーショナルIDが保持する1つまたは複数のXMLスキーマと、XMLスキーマ・リポジトリー内部で管理しているスキーマ・ロケーションを保持しています。また、SYSCAT.XSROBJECTSテーブルと同じOBJECTIDカラムも保持しています。以下のSQL文で、OBJECTID、リレーショナルID、XMLスキーマ・リポジトリー内部で管理しているスキーマ・ロケーション、およびXMLスキーマの内容を得ることができます。
SELECT OBJECTID,OBJECTSCHEMA,OBJECTNAME,SCHEMALOCATION,
XMLPARSE(DOCUMENT COMPONENT)
FROM SYSCAT.XSROBJECTCOMPONENTS; |
表示の都合上、上記のうちXMLスキーマの内容(COMPONENTカラム)以外の情報を取得すると、以下の結果が得られます。
db2 => SELECT OBJECTID,
SUBSTR(OBJECTSCHEMA,1,16) OBJECTSCHEMA,
SUBSTR(OBJECTNAME,1,16) OBJECTNAME,
SUBSTR(SCHEMALOCATION,1,16) SCHEMALOCATION
FROM SYSCAT.XSROBJECTCOMPONENTS;
OBJECTID OBJECTSCHEMA OBJECTNAME SCHEMALOCATION
-------------------- ---------------- ---------------- ----------------
4785074604091136 SAMPLE CUSTOMER1 customer1.xsd
6755399441065728 SAMPLE CUSTOMER2 customer2.xsd
6755399441065728 SAMPLE CUSTOMER2 company2.xsd
7881299347908352 SAMPLE CUSTOMER3 customer3.xsd
8725724278040320 SAMPLE CUSTOMER4 customer4.xsd
8725724278040320 SAMPLE CUSTOMER4 company4.xsd
6 レコードが選択されました。 |
XMLデータの妥当性検証に利用したXMLスキーマのOBJECTIDを取得するには、XMLXSROBJECTID関数を使用します。妥当性検証していないXMLデータにこの関数を使用した場合は、0が返ります。
SELECT XMLXSROBJECTID(XMLDATA) FROM T1; |
単に妥当性検証を行ったかどうかを確認するには、IS VALIDATED を使用します。さらにオプションを指定して、特定のXMLスキーマを使用して妥当性検証を行ったXMLデータのみを取得することも可能です。
SELECT * FROM T1 WHERE XMLDATA IS VALIDATED |
妥当性検証を行ったレコードに対しては'TRUE'、妥当性検証を行っていないレコードに対しては'FALSE'を返す場合、以下のようなSQL文を発行します。
SELECT ID,CASE WHEN XMLDATA IS VALIDATED THEN 'TRUE' ELSE 'FALSE' END FROM T1; |
XMLデータを更新する場合、以下の例のように、あるエレメントの値の変更など、参照するXMLスキーマに適合する更新であっても、XMLVALIDATE関数を指定しないと、以前に妥当性検証した情報は無効となります。
UPDATE T1 SET XMLDATA=XMLQUERY( 'declare namespace cust="http://www.sample.com/customer"; copy $new := $XMLDATA modify do replace value of $new/cust:customer/cust:address with "address4-2" return $new') WHERE ID = 4 |
以下のXMLデータの更新は新たにエレメントを1つ追加しており、参照しているXMLスキーマに適合しなくなりますが、妥当性検証を行っていないため、正常に更新されます。
UPDATE T1 SET XMLDATA=XMLQUERY( 'declare namespace cust="http://www.sample.com/customer"; copy $new := $XMLDATA modify do insert <cust:zip>1234567</cust:zip> into $new/cust:customer return $new') WHERE ID = 4 |
妥当性検証するためには、以下のようにXMLVALIDATE関数を指定します。
UPDATE T1 SET XMLDATA=XMLVALIDATE(XMLQUERY( 'declare namespace cust="http://www.sample.com/customer"; copy $new := $XMLDATA modify do insert <cust:zip>1234567</cust:zip> into $new/cust:customer return $new')) WHERE ID = 4 |
この例の場合、妥当性検証に失敗するためXMLデータの更新はされず、以下のエラーが返されます。
SQL16196N XML 文書に正しく指定されていない要素 "cust:zip" が含まれています。理由コード = "37" SQLSTATE=2200M |
DB2は、XMLスキーマをW3Cで勧告されているスキーマ・ロケーションと、DB2が定義したリレーショナルIDで管理します。W3Cではスキーマ・ロケーションの使用は必須としておらず、各処理プログラムにその処理方法を一任しているため、DB2ではXMLデータに定義されているスキーマ・ロケーションからXMLスキーマを特定し妥当性検証を行うほかに、スキーマ・ロケーションは無視し、リレーショナルIDからXMLスキーマを特定する方法も提供しています。リレーショナルIDはそのユニーク性をDB2で保証しており、また、XMLデータ内に定義されているスキーマ・ロケーションを変更することなく、さまざまなXMLスキーマと妥当性検証することができます。
W3Cの勧告に基づいてスキーマ・ロケーションを使用して妥当性検証を行うこともできますので、ユーザーの好みなどに応じて選択することができます。ただし、DB2はスキーマ・ロケーションのユニーク性を管理していないため、スキーマ・ロケーションを利用する場合、ユーザーがそのユニーク性を管理する必要があります。
どちらの方法を用いた場合でも、XMLデータが妥当性検証されたものか、どのXMLスキーマと妥当性検証されたものかを取得することができます。
また、XMLデータの更新時は、以前の妥当性検証が無効となります。妥当性検証が必要であれば、XMLVALIDATE関数を用いてXMLデータを更新してください。
- Download: IBM DB2 Express-C
- XMLスキーマ Part 0: Primer Second Edition, W3C Recommendation 28 October 2004(英語)
- IBM DB2 9.7 for Linux, UNIX and Windows Information Center
- DB2 9 pureXMLガイド
- ヒント: スキーマと名前空間の処理, developerWorks
- DB2 9.5 でXMLを更新する, developerWorks
- 本記事では触れていませんが、XMLスキーマの進化に関する参考文献として以下が挙げられます
- スキーマが進化するなかで XML クエリーを維持する方法, developerWorks
- DB2 pureXML を使って XML スキーマを進化させる, developerWorks
- スキーマが進化するなかで XML クエリーを維持する方法, developerWorks