数据库资讯

DB2 Version 9.5 pureXML的增强和新特性

下表是一个示例employee表,该表拥有员工的详细地址,包含以下记录:

IDNAMESTREETCITYSTATECOUNTRY
1manojsector14gurgaonharyanaindia

下面的查询在该行中应用了xmlrow和xmlgroup函数。

清单14.新发布函数

db2SELECTXMLROW(id,name,street,city,state,country)FROMEMPLOYEE
1
manoj
sector14
gurgaon
haryana
india
db2SELECTXMLGROUP(id,name,street,city,state,country)FROMEMPLOYEE
1
manoj
sector14
gurgaon
haryana
india

在DB2 9中,为了得到相同结果,除了显式地提供元素名称,还需要将xmlelement应用到每个列值。

跟V91版本中相同的查询相比,示例代码xmlintegrate.db2为这些函数提供了更多复杂例子。可以在sqllib/samples /xml/clp目录下找到该示例。

将参数传递给sqlquery函数

在DB2 9中,sqlquery函数将一个SQL语句嵌入到XQuery表达式中。此函数将一个字符串值作为输入,该字符串是一个有效的SQL全选择语句。在 DB2 9中,不能将参数从XQuery语句传递给此函数。

DB2 V9.5增强了该函数,引进了一个新的parameter函数,该函数将一个整数值作为输入。现在,sqlquery函数可以将多个参数作为输入,第一个 参数是一个表示全选择的字符串,其后是参数的值。sqlquery函数的第一个字符串参数可以包含parameter函数,该函数将会被传递给 sqlquery函数的参数取代,该参数位于第一个必需的字符串参数之后。传递给parameter函数的整数值表示在调用sqlquery函数中参数的 位置,该参数将会在调用中被取代。例如,parameter(1)告诉解析器用字符串参数后的第一个参数替代这个值。参数的类型应该和全选择所期望的值类 型相同。可以使用类型转换函数将值转换为一个合适的类型。

让我们以示例数据库中的customer表作为例子。可以通过运行db2sampl命令和从firststep创建示例数据库。firststep 是DB2提供的一个工具,在安装了DB2之后就会执行,也可以在以后通过在Windows中选择 Start>AllPrograms>IBMDB2>db2copyname>Setuptools>firststeps 来执行。

customer表包含一个作为关系列的cid列,以及表示顾客id的键值。infoXML列具有一个属性Cid,该属性也表示顾客id。如果数据 是一致的,那么属性Cid值应该与特定行的cid列值相同。以下的查询将检查数据保持一致的行的数量。Cid属性的值被传递给sqlquery函数,以将 其与关系cid值进行比较。

清单15.将参数传递给sqlquery函数

xquerydeclaredefaultelementnamespace"http://posample.org";
for$iindb2-fn:xmlcolumn("CUSTOMER.INFO")/customerinfo/@Cid
for$jindb2-fn:sqlquery("selectinfofromcustomerwherecid=parameter(1)",$i)
return
{$i}

此查询返回所有数据一致的顾客id。

示例代码xqueryparam.db2提供了一些不错的例子,将一个和多个参数传递给sqlquery函 数。可以在sqllib/samples/xml/clp目录中找到该示例。

现有函数XMLQuery、XMLtable和XMLExists的默认传递行为

在DB2 9中,函数xmlquery、xmltable和xmlexists用来将Xquery语句嵌入到SQL语句中。利用这些函数的PASSING子句将参数 从SQL语句传递给这些函数。

在DB2 9中,如果同一个SQL语句中的这些函数会执行多次,那么每次执行都需要一个独立的PASSING子句。有时这会使查询的结构看起来很复杂和庞大。DB2 V9.5扩展了这些函数,以使用默认的传递机制。现在,将一个列名称用作这些函数的Xquery中的一个变量名。如果没有使用显式的PASSING子句, 默认情况下DB2将传递相同列给一个变量。这使查询更精简并更易于理解。以下代码给出了一个针对示例数据库表的例子。查询为名为 RobertShoemaker的顾客获取purchaseorder中的第一项。

清单16.SQL/XML函数的默认传递行为

SELECTXMLQUERY('declaredefaultelementnamespace"http://posample.org";
$PORDER/PurchaseOrder/item[1]')
FROMpurchaseorderASp,customerASc
WHEREXMLEXISTS('declaredefaultelementnamespace"
http://posample.org";
$INFO/customerinfo[name="RobertShoemaker"and@Cid=$CUSTID]')

对于SELECT子句中的xmlquery函数,默认情况下传递purchaseorder表的 porder列。同样地,对于xmlexists函数,默认情况下传递customer表的info列和custid列。请确保以大写字母的方式使用这些 变量的名称,因为xquery是一个区分大小写的语言,而且关系列名称常常以大写的方式存储。

XML验证约束

DB2 V9.5增强了SELCT语句使用的ISVALIDATED子句,以包含ACCORDINGTOXMLSCHEMAID。现在用户能够提供多个模式并仅选 择针对这些模式验证的XML值。DB2 V9.5可以将任何XML表达式(而不是一列)作为一个操作数,这具有很大的灵活性。下面的例子只选择了customer表中用customer模式验证 之后的文档。

清单17.SELECT语句中的XML验证约束

db2SELECTinfoFROMcustomer
WHEREinfoISVALIDATEDACCORDINGTOXMLSCHEMAIDcustomer

经过注释的XML模式分解

DB2 9支持XML模式的注释,因此除递归模式外,可以将数据分解为关系表。DB2 V9.5解除了这个限制,现在即使模式是递归的,用户也可以对数据进行注释和分解。

希望看到您的想法,请您发表评论x