IBM 新的 DB2 9 为开发人员提供了一种更快、更有效的方式来管理关系数据库中的 XML 文档。然而,为了挖掘出更多的潜能,数据库开发人员还需要在他们的武器库中增加一种新的语法:XQuery。虽然 XQuery 学起来很简单,但是它非常完善,足以构造更高级的耗时且费力的查询。
进入 DB2 9 Developer Workbench。新的 Workbench 被打包成一个单独的安装程序,它取代了其前辈 DB2 Development Center。它基于 Eclipse 引擎,在 Visual XQuery Builder 中提供了新的高级 XML 功能,包括基于已有的 XML 字段或单独的 XML 模式文档可视化地设计 XQuery 的能力。Developer Workbench 还可以与 DB2 for z/OS 数据服务器一起使用。
Visual XQuery Builder
您可以在 SAMPLE 数据库上运行一些简单的查询,试一试 XQuery Builder。随 DB2 9 一起发布的 SAMPLE 数据库中有一些具有 XML 字段的表,这些表都填充了示例数据。例如 CUSTOMER 表,这个表有 XML 类型的 INFO 和 HISTORY 字段。还可以用命令 db2sampl -xml 创建自己的示例数据库。
要试一下 XQuery Builder,可以打开 DB2 Workbench,并开始一个新项目:选择 File → New → Data Development Project,或者单击 New Project 图标,然后选择 Data Development Project。
接着,将该项目命名为 XQueryProject,并保留其他默认设置。如果已经连接到 SAMPLE 数据库,那么在 Use an Existing Connection 下选择它。如果还没有连接到 SAMPLE 数据库,那么采取以下步骤:
- 选择 Create a New Connection。
- 在 Connection Parameters 下, 选择 DB2 UDB v9.1。
- 指定 SAMPLE 作为数据库名,保留其他默认设置。
- 输入登录名和密码(如果不特别指定的话,就是系统登录名/密码),然后单击 Test Connection。
- 如果一切正常,则单击 Next 继续。
在 New Project 向导的最后一部分,保留 Routine Parameters 的默认设置,并单击 Finish。
Workbench 创建好新项目之后,应该可以在左上区的 Data Project Explorer 中看到这个项目。在 Database Explorer 中,在新建的项目下面可以看到 SAMPLE 数据库。如果还没有连接到该数据库,那么单击右键,选择 Connect 或 Reconnect,并输入凭证。
展开这两个窗口中的条目。注意,在 Data Project Explorer 中的新项目下,有下面一些空的文件夹:
- XML Queries
- SQL Scripts
- Stored Procedures
- XML Schema Documents
- User-Defined Functions。
Developer Workbench 的部分威力依赖于它所提供的一组向导,其中大多数向导可以在这些文件夹上通过上下文菜单打开。在这里可以添加 XSD 文件到项目中,以便于 XML 操纵。还可以构建新的存储过程、脚本,甚至包括自己的函数。但是在这里我们将把注意力放在第一个文件夹上:XML Queries。
创建一个 XML 查询
您可以通过打开 New XML Query 向导来创建第一个 XML 查询。首先,在 Data Project Explorer 面板中的 XML Queries 文件夹上单击右键,然后选择 New XML Query。 将这个 XML 查询命名为 SimpleXQuery。
当看到 Add representative XML documents 选项时,单击 Add。这里有两个选项,一是让 Workbench 根据示例数据发现并创建一个 XML 模式,另外一种选项是使用一个已有的模式:
- Local workspace:如果已经为要使用的数据集生成了一个模式,或者已经将一个已有的 XSD 或 DTD 文档保存到工作区,那么选择该选项并找到该模式。
- Database: 如果要根据已有的 XML 数据创建一个新模式,那么选择 Database 选项。
对于这个例子,选择 Database。 对于 XML 列或模式,导航到 CUSTOMER.INFO(如果不确定如何找到它,可以在线参考图 A)。
在该向导接下来的屏幕中,可以将文档与特定的 XML 文档关联起来,您将在该 XML 文档上构建查询。在 SAMPLE 数据库中,每一行可以包含一个具有不同模式的 XML 文档。在这里,可以在行之间导航,以选择要使用的模式。对于这个例子,选择 Document 2 (见图 1)。
图 1. XML 文档行
在该向导的最后一个屏幕中,该向导要求您将文档与 XML 列相关联。如果您一直使用一个已有的 XML 模式,那么需要在这里关联它。但是这个例子是基于已有数据的模式的,因此默认情况下模式文档已经是关联的。
现在您已经创建了一个新的 XQuery View,并将其命名为 SimpleXQuery.xqm。我们花一点时间来探索一下这个视图。您将看到,示例数据使用指定列的第一行的 XML 模式列出。您还将看到大量的语法,这些语法可以直接被拖放到设计工作区,包括 Constructors、Expressions、Functions 和 Variables,它们都是基于目前万维网联盟(W3C)正在评审的 XQuery 规范的。
构建一个可视化 XQuery
有了新的 XQuery 网格,您将创建一个简单的包含一些条件的查询。
展开 Constructors 类别,将一个新的 Element 拖放到网格上。对于拖放到网格上的每个项目,都可以在它右边看到一个 Step Into 图标。单击 new_element 的这个图标。
将该元素的 Name 改为 toronto(见图 2)。不用关心 Attributes。 拖放 Element Value 下的 name 节点。注意,name 节点现在也有一个 Step Into 图标。单击该图标。
图 2. XML 元素
在 Visual Builder 中,每当单击 Step Into,就会打开相应项目所特有的一个子页面。对于 XML 节点,它打开 For、Let、Where、Order by、Return diagram 或 FLWOR。这个图基本上相当于 SQL 中的 SELECT-FROM-WHERE 子句,它允许您定义查询的选择标准。
Workbench 自动为 FLWOR 语句所需的绑定变量赋值,不过可以改变它的值。在这个例子中,它被命名为 name0。默认情况下,这个例子中的 Sequence 和 Return 值都是 name 节点。您只需定义条件。为此,展开左侧的 Functions 类别,从下拉菜单中选择 String Functions,如果该项还没有被选中的话。您有很多内建的函数可以选择,因此在 WHERE 子句时有很多选择余地。这个例子的目标是选择来自 Toronto 的所有客户。最直接的方法是将 city 节点拖放到 Operand 1 下,选择 = 作为 Operator,键入 Toronto 作为 Operand 2。还可以使用 match() 函数来定义一个模式,或者混合任意数量的字符串函数来创建更明确的标准。为简单起见,拖出 contains() 函数并将它放在 Operand 1 下(见图 3)。
图 3. 包含 contains() 函数的 FLWOR
由于 contains() 函数返回 True 或 False,因此不需要再指定一个操作数。单击该函数对应的 Step Into,定义该函数的参数。contains() 函数带两个参数:string 和 substring。将 city 节点拖到 string 参数上。在 substring 旁边输入 onto。这将选出包含字母 onto(全部为小写)的所有城市。这个步骤类似于 SQL 中的 LIKE '%onto%'。
图 4. 定义 contains() 函数
在该窗口的右上角,可以看到一个 Step Out 图标。单击该图标,或者从下拉菜单中选择 OK,进入到上一级。在 For Logic 定义中,增加一个字段。将 phone 元素拖放到 Return 网格上的 name 下。然后再次单击 Step Out。
再次单击 Step Out,返回到 root 级节点。在这里可以继续添加节点。现在,运行一下查询,看看结果。在右上角的图标上单击右键,从下拉菜单中选择 Run...,或者从主菜单中选择 Run → Run...。
这里还有一次机会将 XML 列与一个定义文档相关联,但是由于它已经被正确地关联了,因此只需单击 Finish。在 Data Output 视图中,应该可以看到
您可以查看两种格式的结果:XML Tree (见图 5) 或 Source,后者是一种无格式文本转储。在这个简单的例子中,所有结果都被收集在一个根节点下,包括任何重复的客户。但是,通过较小的调整,就可以改变节点层次,增加附加字段,删除重复的行,或者增加聚合函数。
图 5. 示例 XQuery 的结果
还可以对一个外部文件执行 Save As... 命令。实际上,如果单击 Save As 并保存到 demo.xml,可以在 Web 浏览器中打开这个文件,并看到包含查询结果的一个基本的(但是不完全是格式良好的)XML 文档。
最后一个特性
现在轮到了我认为是 Visual Builder 最好的一个特性。回到网格上,选择左上角的 Source 标签页。您将看到自动生成的描述查询的 XQuery 代码。该代码的主体可以直接在数据库查询或存储过程中使用,这对于动态构建 XML 查询是一种快速有效的方法。我们的例子生成了如清单 1 所示的源代码。
边练边学
这个例子只是开始探索 Visual XQuery Builder 的潜能。除了帮助您创建复杂的嵌入式 XML 查询外,它还可以生成源代码,通过查看源代码,或者在其他地方使用该源代码,有助于学习 XQuery 的语法。