扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
回忆一下在 “DB2 Viper 快速入门” 中我们是如何插入 XML 数据的,这里的语句大部分仍然是类似的。与任何 SQL UPDATE 语句一样,这个例子首先标识出要更新的表和列。由于目标列包含 XML 数据,因此需要提供一个格式良好的 XML 文档作为新的目标值。虽然大多数生产环境在应用程序中使用主机变量或参数标记位来更新 XML 数据,但是在这里我展示了用一种简单的方式来交互式地完成该任务。第二行使用 XMLParse 函数将输入字符串转换成 XML。对于 beta 版的 Viper,需要显式地调用 XMLParse。当 Viper 变得普遍可用时,显式调用应该只是成为一种选择。最后一行是一个标准的 SQL 子句,规定只更新表中特定的一行。
如果执行上述 UPDATE 语句,则客户 3227 的 "contactinfo" 列将只包含 email 信息,如 清单 23 所示:
清单 23. 执行上述 UPDATE 语句的效果
|
这位客户的地址、电话号码和传真号码(如 图 2 所示)将丢失。而且,之前编写的用于提取客户的 email 地址的那些查询也无法恢复这些信息。为什么?之前的那些查询包括 XPath 或 XQuery 表达式,这些表达式在一个特定的文档层次结构中导航,而在这个结构中 Client 是根元素,email 是一个子元素。在像上面这样更新该文档之后,email 将变成这个客户的 XML 记录的根元素;因此,在这个层次结构中再也不能在预期的位置上找到它的值。
如果要交互式地更新这个客户的 email 地址,并且保留所有其他已有的联系方式信息,应该像 清单 24 中那样重写查询:
清单 24. 修改后的 UPDATE 语句
|
也许您想知道是否可以通过一个视图进行更新,从而避免提供整个 XML 文档。例如,清单 13 中定义的 commentview 使用 XMLTable 函数提取 XML 文档中的某些元素,并将这些元素转换成视图中的 SQL 列。那么,是否可以更新这些 SQL 列中某个列的值,并将结果写回到初始的 XML 文档的适当子元素中呢?答案是否定的。在 DB2 中,基于 SQL 类型的视图列与从一个函数(在这里是 XMLTable 函数)得到的视图列是有区别的。对后者的更新不受支持。
删除 XML 数据
删除包含 XML 列的行很简单。SQL DELETE 语句允许通过 WHERE 子句识别(或限制)要删除的行。该子句可以包括简单的谓词来标识非 XML 列值或包括 SQL/XML 函数来标识包含在 XML 列中的 XML 元素值。
例如,下面展示了如何删除客户 ID 为 3227 的客户的所有信息:
清单 25. 删除一个特定客户的数据
|
还记得怎样限制 SQL SELECT 语句,使之仅返回居住在邮政编码为 95116 的地区的客户的行吗?如果还记得的话,很容易知道如何删除与那些客户相关的行。下面看看如何使用 XMLExists 来做这件事:
清单 26. 删除居住在特定地区的客户的数据
|
建立索引
最后,值得注意的是,您可以创建专门的 XML 索引来加快对 XML 列中的数据的访问。由于本文是介绍性的文章,并且示例数据量比较少,所以本文不讨论这个话题。但是,在生产环境中,定义适当的索引对于取得最佳性能是非常重要的。本文的 参考资料 小节可以帮助您了解更多关于新的 DB2 索引技术的知识。
结束语
本文谈到了很多基础知识,提到了 SQL/XML 的几个关键方面,并展示了如何使用 SQL/XML 查询 XML 列中的数据。当然,除了这里讨论的用法外,用 SQL 和 SQL/XML 函数还可以做更多的事。本文给出了一个 简单的 Java 例子,这个例子解释了如何使用参数标记位和 SQL/XML 来查询 XML 列中的数据。在将来的文章中我们将更详细地讨论应用程序开发。但是,接下来的文章将探索 DB2 Viper 支持的一种新的查询语言,即 XQuery 的一些有趣的方面。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者