五、使用XQuery查询数据库
XQuery本来是为查询XML数据而制定的标准。但在DB2中,XQuery已经成为专门查询xml类型字段内容的工具。由于XML数据和关系型 数据有着很大的差异,因此,我们需要一种专门的语言来查询这些层次型数据。但XQuery是专门为XML数据而设计的,因此,单独使用XQuery,并不能很好地处理关系型数据。因此,在DB2 Express-C中可以在XQuery中嵌入SQL语言来同时查询XML数据和关系型数据。
IBM还特意为此提供了编程接口API,用于其他编程语言来使用嵌入SQL的XQuery。这些接口主要包括CLI/ODBC、嵌入式 SQL、JDBC 和 .NET等。DB2命令行也可以支持XQuery,但必须使用XQUERY关键字来启动运行它们。如下面的XQuery语句:
上面的XQuery返回了table1表中xml_data字段的id值为"xyz:"的所有的field1节点值。XQUERY
FOR $table1 in db2-fn:xmlcolumn("table1.xml_data")/table1
WHERE $table1/@id="xyz"
RETURN $table1/row/field1;
我们也可以在嵌入SQL的XQuery语句中使用全文检索功能。在XQuery中使用全文检索可以在WHERE子句中使用文本搜索函数“CONTAINS"来查找文本。如下面的XQuery语句在table1的xml_data字段中查找description节点值包含”销售信息“的记录,并返回field2结点的值。
嵌入了 SQL 的 XQuery 对于那些需要整合关系型数据和 XML 数据的应用程序非常有用。我们可以通过组合方式查询 XML 数据与关系型数据。这同样适用于 SQL/XML。但你可能会发现,在 SQL/XML 中利用 XMLEXISTS 函数连接 XML 值和关系值更轻松。请看下面两条查询语句的效果是一样的,但第二种更简单一些:XQUERY
FOR $emp IN db2-fn:sqlquery("
SELECT xml_data FROM table1
WHERE CONTAINS(xml_data, 'SECTION(""/table1/description"") ""销售信息"" ')=1 ")//row return $emp/field2;
XQuery中嵌入SQL语句
在SQL语句中嵌入XQueryXQUERY
FOR $m in db2-fn:sqlquery('SELECT XMLCAST(t2.name as XML) from table2 t2')
FOR $d in db2-fn:xmlcolumn("table1.xml_data")/table1
WHERE $d/row/field1 = $m
return $d/data(@id);
![]()
虽然嵌入SQL的XQuery可以很好地处理XML数据,但目前还不能在嵌入式 SQL 语句中使用参数标记,因此不允许向XQuery中的SQL传递参数,所以在结合XML数据和关系型数据方面,嵌入XQuery的SQL语言更强大。如嵌入了 SQL 的 XQuery 无法像 SQL/XML 那样用于表示关系列和 XML 列之间的连接。SELECT XMLQUERY('$d/table1/data(@id)' passing t1.xml_data as "xd")
FROM table1 t1, table2 t2
WHERE XMLEXISTS('$xd//row[field1 = $n]'
passing t1.xml_data as "xd", t2.name as "n");
六、结束语
DB2 Express-C为查询XML数据提供了一套强大的Pure XML技术,你可以根据自己的需要选择使用上述的任何一种技术来处理数据。在这几种解决方案中,SQL/XML(在SQL中嵌入XQuery语句)是最灵活的方式,但要是只处理XML数据,建议直接使用XQuery来查询数据表。您还可以利用本文所讨论的技术编写出更为复杂的语句,如在XQuery语句中嵌入含有XQuery语句的SQL。也可以将它们反过来处理,这有些象嵌套的SQL语句。
