DB2 10.5 for Linux, UNIX, and Windows

更新 XML 数据

要更新 XML 列中的数据,可使用 SQL UPDATE 语句。想要更新特定行时,可包括 WHERE 子句。 将替换整个列值。XML 列的输入必须是格式良好的 XML 文档。应用程序数据类型可以是 XML、字符或二进制类型。

更新 XML 列时,还可能想要针对已注册的 XML 模式验证输入 XML 文档。可以使用 XMLVALIDATE 函数来执行此操作。

可以使用 XML 列值来指定要更新的行。要查找 XML 文档内的值,需要使用 XQuery 表达式。可使用 XMLEXISTS 谓词指定 XQuery 表达式,它允许您指定 XQuery 表达式并确定该表达式是否导致空序列。在 WHERE 子句中指定了 XMLEXISTS 子句时,如果 XQuery 表达式返回非空序列,那么将更新行。

下列示例说明了如何更新 XML 列中的 XML 数据。这些示例使用表 MYCUSTOMER,它是样本 CUSTOMER 表的副本。这些样本假定 MYCUSTOMER 已包含客户标识值为 1004 的行。假定用于更新现有列数据的 XML 数据存储在文件 c7.xml 中,其内容如下所示:
<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>
示例:在 JDBC 应用程序中,以二进制数据的形式读取文件 c7.xml 中的 XML 数据,并使用它来更新 XML 列中的数据:
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();
示例:在嵌入式 C 应用程序中,通过二进制 XML 主变量更新 XML 列中的数据:
  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;
在这些示例中,<customerinfo> 元素内 Cid 属性的值正好也存储在 CID 关系列中。因此,UPDATE 语句中的 WHERE 子句使用关系列 CID 来指定要更新的行。如果仅在 XML 文档内找到用于确定选择哪些行来进行更新的值,那么可以使用 XMLEXISTS 谓词。例如,可以按如下所示将上一个嵌入式 C 应用程序示例中的 UPDATE 语句更改为使用 XMLEXISTS:
EXEC SQL UPDATE MyCustomer SET Info=:xml_hostvar
       WHERE XMLEXISTS ('$doc/customerinfo[@Cid = $c]' 
                         passing INFO as "doc", cast(:cid as integer) as "c");
示例:以下示例更新 MYCUSTOMER 表中的现有 XML 数据。SQL UPDATE 语句会作用于 MYCUSTOMER 表的一行并将该行 INFO 列中的文档替换为变换表达式修改后的文档逻辑快照:
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