更新 XML 列时,还可能想要针对已注册的 XML 模式验证输入 XML 文档。可以使用 XMLVALIDATE 函数来执行此操作。
可以使用 XML 列值来指定要更新的行。要查找 XML 文档内的值,需要使用 XQuery 表达式。可使用 XMLEXISTS 谓词指定 XQuery 表达式,它允许您指定 XQuery 表达式并确定该表达式是否导致空序列。在 WHERE 子句中指定了 XMLEXISTS 子句时,如果 XQuery 表达式返回非空序列,那么将更新行。
<customerinfo Cid="1004">
<name>Christine Haas</name>
<addr country="Canada">
<street>12 Topgrove</street>
<city>Toronto</city>
<prov-state>Ontario</prov-state>
<pcode-zip>N9Y-8G9</pcode-zip>
</addr>
<phone type="work">905-555-5238</phone>
<phone type="home">416-555-2934</phone>
</customerinfo>
PreparedStatement updateStmt = null;
String sqls = null;
int cid = 1004;
sqls = "UPDATE MyCustomer SET Info=? WHERE Cid=?";
updateStmt = conn.prepareStatement(sqls);
updateStmt.setInt(1, cid);
File file = new File("c7.xml");
updateStmt.setBinaryStream(2, new FileInputStream(file), (int)file.length());
updateStmt.executeUpdate();
EXEC SQL BEGIN DECLARE SECTION;
sqlint64 cid;
SQL TYPE IS XML AS BLOB (10K) xml_hostvar;
EXEC SQL END DECLARE SECTION;
...
cid=1004;
/* Read data from file c7.xml into xml_hostvar */
...
EXEC SQL UPDATE MyCustomer SET Info=:xml_hostvar WHERE Cid=:cid;
EXEC SQL UPDATE MyCustomer SET Info=:xml_hostvar
WHERE XMLEXISTS ('$doc/customerinfo[@Cid = $c]'
passing INFO as "doc", cast(:cid as integer) as "c");
UPDATE MyCustomer
SET info = XMLQUERY(
'transform
copy $newinfo := $info
modify do insert <status>Current</status> as last into $newinfo/customerinfo
return $newinfo' passing info as "info")
WHERE cid = 1004