技术开发 频道

为DB2 XML数据开发Java应用程序

    更新和删除 XML 数据

    要更新和删除存储在 DB2 中的 XML 数据,可使用 SQL UPDATE 和 DELETE 语句。这些语句可包含 SQL/XML 函数,后者用于基于存储在 XML 列中的 XML 元素值来限制目标行和列。例如,您可以删除包含居住在指定邮编地区的客户的信息的行,或者只更新居住在指定州的客户的 XML(和非 XML 数据)。

    因为在 UPDATE 和 DELETE 语句中使用 SQL/XML 函数时的语法与在 SELECT 语句中使用 SQL/XML 函数时的语法相同,所以这里不再重复给出完整的代码示例。相反,只给出简要的摘录。我们首先来看 DELETE 操作。

    删除的例子

    删除包含 XML 数据的行很简单。只要使用一个 SQL DELETE 语句即可,可以根据需要带有一个 WHERE 子句来限制要删除的行。例如,下面的代码删除客户 ID 为 1885 的行:

    清单 13. 基于关系数据值删除数据  

. . . int clientID = 1885; String query = "delete FROM clients WHERE id = ?"; . . . PreparedStatement stmt = conn.prepareStatement(query); stmt.setInt(1, clientID); if (stmt.executeUpdate() == 0) { System.out.println("No records deleted."); } else { System.out.println("Record(s) deleted."); } . . .

    如果您想要基于 XML 元素值限制 DELETE 操作,只需在 WHERE 子句中调用适当的 SQL/XML 函数即可。清单 14 使用 XMLExists 函数来指定应该删除居住在缅因州(缩写为 "ME")的所有客户的信息:

    清单 14. 基于 XML 元素值删除数据 

String state = "ME"; String query = "delete from clients " + " where xmlexists('$y/Client/Address[state=$state]' " + " passing clients.contactinfo as \"y\", " + " cast(? as char(2)) as \"state\" )"; . . . PreparedStatement stmt = conn.prepareStatement(query); stmt.setString(1, state); . . .

    更新的例子

    可以使用 SQL UPDATE 语句或存储过程(比如 DB2XMLFUNCTIONS.XMLUPDATE)更新 XML 列中的数据。在这两种情况下,更新 XML 列都发生在文档级别而非元素级别。但是,使用存储过程进行更新的程序员不需要向 DB2 提供完整的 XML 文档。他们只需要指定要更新的 XML 元素,DB2 会保护未更改的文档数据,并更新指定的元素。发出 UPDATE 语句的程序员需要指定完整的文档(而不只是他们想要更改的元素)。

    下一篇文章将要讨论 XMLUPDATE 存储过程,并会给出一些示例代码,所以这里不对它进行讨论。相反,本节将回顾两个发出 UPDATE 语句的代码示例。您会发现自己很熟悉这两个例子的逻辑。一个例子使用 XML 文件来更新 clients 表,而另一个例子则使用包含 XML 的字符串。

    清单 15 通过使用包含在文件中的 XML 数据来更新客户 ID 为 1333 的联系信息。注意,新 XML 数据针对作为更新操作一部分的已注册模式进行验证:

    清单 15. 从文件更新 XML 数据 

int clientID = 1333; String fn = "c:/XMLFiles/Client1333.xml"; // input file String query = "update clients set contactinfo = " + "xmlvalidate(? according to xmlschema id user1.mysample) " + "where id = ?"; . . . PreparedStatement stmt = conn.prepareStatement(query); stmt.setInt(2, clientID); File file = new File(fn); stmt.setBinaryStream(1, new FileInputStream(file), (int)file.length()); . . .

    当然,您也可以使用 XML 查询谓词来指定想要更新的客户联系记录。同样,需要使用 SQL/XML 函数来指定。假设一个客户想要您更新她的传真号码,却不记得自己的客户 ID。相反,她提供自己的家庭电话号码来帮助找到她的信息。下面这个代码摘录使用 XMLExists 来限制只更新包含她的家庭电话号码的记录。注意,客户的完整联系信息被作为一个包含修订后的 XML 文档的 Java 字符串提供。

    清单 16. 利用字符串更新 XML 数据

String homeph = "4081114444"; String xml = "<?xml version=\"1.0\"?>" + "<Client>" + "<Address> " + "<street>54 Moorpark Ave.</street>" + "<city>San Jose</city>" + "<state>CA</state>" + "<zip>95110</zip>" + "</Address>" + "<phone>" + "<work>4084630110</work>" + "<home>4081114444</home>" + "<cell>4082223333</cell>" + "</phone>" + "<fax>4087773111</fax>" + "<email>sailer555@yahoo.com</email>" + "</Client>"; String query = "update clients set contactinfo = ?" + "where xmlexists('$y/Client/phone[home=$homeph]' " + " passing clients.contactinfo as \"y\", " + " cast(? as varchar(11)) as \"homeph\" )"; . . . PreparedStatement stmt = conn.prepareStatement(query); stmt.setString(1, xml); stmt.setString(2, homeph); . . .
0
相关文章