cust1.xsd 定義 customer 元素包含 name、address、phone、email。數據 cust1.xml 遵循此 Schema。註冊並導入表 T1:
REGISTER XMLSCHEMA 'cust1.xsd' FROM '/work/cust1.xsd' AS SAMPLE2.CUST1;
COMPLETE XMLSCHEMA SAMPLE2.CUST1;
CREATE TABLE T1 (ID INT NOT NULL PRIMARY KEY, XMLDATA XML NOT NULL);
IMPORT FROM /work/cust1.del OF DEL XML FROM /work XMLVALIDATE USING SCHEMA SAMPLE2.CUST1 INSERT INTO T1;
查詢驗證信息顯示 OBJECTID、關系 ID SAMPLE2.CUST1、Schema 位置 cust1.xsd。
cust2.xsd 在 phone 後添加 <xs:element name="cell-phone" minOccurs="0" type="xs:string"/>。註冊後用 UPDATE XMLSCHEMA 替換:
UPDATE XMLSCHEMA SAMPLE2.CUST1 WITH SAMPLE2.CUST2;
新數據 cust2.xml 包含 cell-phone,用舊關系 ID SAMPLE2.CUST1 驗證導入成功。查詢顯示兩條記錄 OBJECTID 不變,Schema 位置更新為 cust2.xsd。舊數據自動符合新 Schema。
UPDATE XMLSCHEMA SAMPLE2.CUST1 WITH SAMPLE2.CUST2 DROP NEW SCHEMA;REGISTER XMLSCHEMA 'cust1.xsd' FROM '/work/cust2.xsd' AS SAMPLE2.CUST2;cust3.xsd 將 phone 重構為複雜類型 phoneType,包含必填 home、cell 子元素。註冊導入新數據 cust3.xml。
ID 1、2、22 的舊數據需轉換:
UPDATE T1
SET XMLDATA = XMLVALIDATE(XMLQUERY(
'declare namespace xsi="https://www.w3.org/2001/XMLSchema-instance";
copy $new := $XMLDATA
modify (
do replace $new/customer/phone with
<phone>
<home>{$new/customer/phone/text()}</home>
<cell>{$new/customer/cell-phone/text()}</cell>
</phone>,
do replace value of $new/customer/@xsi:noNamespaceSchemaLocation with "cust3.xsd",
do delete $new/customer/cell-phone
)
return $new'))
WHERE XMLXSROBJECTID(XMLDATA) = (SELECT OBJECTID FROM SYSCAT.XSROBJECTS
WHERE OBJECTSCHEMA='SAMPLE2' AND OBJECTNAME='CUST1');
使用 XMLQUERY 複製修改返回新文檔,XMLVALIDATE 按新 Schema 位置驗證,WHERE 子句精確定位舊 Schema 驗證的記錄。