使用生成列
DB2 9.7 for LUW中新的IBM DB2 pureXML特性允许你与数据库分区功能(Database Partitioning Feature,DPF),范围分区表和多维集群(MDC)表一起使用XML列,但分区或集群键必须由相关的列组成。前面你已经看到了如何使用INSERT和XMLTABLE从XML文档抽取值到相关的列中,你可以使用这些关联列对表进行分区或集群。如果你更喜欢在程序中使用简单的INSERT语句,并且不知道如何抽取数据时,那你可以考虑使用一个生成的列。
DB2 9.7在用户定义函数(UDF)中支持XML参数,允许你定义生成的列,使用插入的XML文档中的值自动填充。下面的代码显示了一个UDF,它接受一个XML文档作为输入,如前面例子中的订单文档,这个UDF使用XMLCAST和XMLQUERY函数抽取输入文档的OrderDate属性:
CREATE FUNCTION extractDate(doc XML)
RETURNS DATE
LANGUAGE SQL CONTAINS SQL
NO EXTERNAL ACTION DETERMINISTIC
RETURN XMLCAST(XMLQUERY('$d/order/@OrderDate' PASSING doc AS "d") AS DATE);
你可以在SELECT查询和其它SQL语句中使用这个UDF,但也要定义一个生成列,对于下面的示例,假设检索和插入完整的订单是最关键的操作,在这种情况下,完整地存储订单文档是最好的选择。下面的代码定义了一个使用XML列存储订单的表,并自动抽取订单日期填充到关联的列(odate)中。一条INSERT语句现在可以简单地插入一个XML文档到order列中,不需要考虑抽取值到关联列中:
CREATE TABLE orders(
order XML,
odate DATE GENERATED ALWAYS AS (extractDate(order)));
如果你连续不断地存储许多订单,可能需要对旧订单进行归档,这个时候使用范围分区是最好的选择,下面的代码显示了表order2是通过按odate列的值进行分区的,odate列则产生自XML列,同样,你可以使用生成的列作为分区数据库的分配键,也可以作为MDC表的集群键:
CREATE TABLE order2(
order XML,
odate DATE GENERATED ALWAYS AS (extractDate(order)) NOT NULL)
PARTITION BY RANGE (odate) (PART q109 STARTING('01-01-2009') ENDING ('03-31-2009') INCLUSIVE,
PART q209 ENDING ('06-30-2009') INCLUSIVE,
PART q309 ENDING ('09-30-2009') INCLUSIVE,
PART q409 ENDING ('12-31-2009') INCLUSIVE);
控制XML存储
自定义XML存储有许多好处,将大型XML文档拆分成多个小文档,将会使操作XML数据变得更加容易和高效,使用UDF定义生成列可以简化XML值抽取到关联列,使用生成列还可以帮助你管理分区数据库,范围分区表,或MDC表中的XML。