[经验总结]DB2 XML Update技术

08年中IBM推出DB2 9.5版增加了对XML列的结点级更新功能,这个功能扩展了Update与XQuery语句。W3C在XML Update方面还没有正式的标准,只发布一个草案XQuery Update Facility 1.0 ,这个草案的第一作者Don Chamberlin 来自IBM Almaden研究中心,DB2新加的查询语言自然也遵守这个草案。大公司的产品这点做点比较好,对新标准跟得很紧。

       去年8月,项目要实现一个对XML数据进行结点更新的功能,这个看似简单的功能其实很棘手,之前用一款开源的原生XML数据库实现这一款功能时,因为其提供的更新语句的功能有限,写了N个(N>10)更新语句才搞定。无奈之下,求助于网络,找到了XQuery Update,DB2 9.5又恰逢其时的推出,所以在项目中立即升级数据库,用XML Update实现了更新功能。 去年DB2在这方面的资料很少,只有一篇Update XML in DB2 9. ,现在的文档补充了不少,在Developworks里能搜出好几篇教程。DB2 的XML Update功能并不很完善,例如不能对空的XML列进行操作,一些复杂的更新操作还不能实现。希望DB2能在新版本扩展XQuery的更新功能,而不是像现在这样通过 Update语句来更新。

      最后看一段XML Update代码吧。

snprintf(xupdate,MAX_XUPDATE, "copy $new := $DOC " "modify " "if (fn:not($new/tissue_information/tissue[@name=/"%2$s/"])) " "then do insert " " <tissue name=/"%2$s/"> " " <feature name=/"%1$s/"> {$t}</feature> " " </tissue> " " into $new/tissue_information " "else if(fn:not($new/tissue_information/tissue[@name=/"%2$s/"]/feature[@name=/"%1$s/"])) " "then do insert " " <feature name=/"%1$s/">{$t}</feature> " " into $new/tissue_information/tissue[@name=/"%2$s/"] " "else do replace " " value of $new/tissue_information/tissue[@name=/"%2$s/"]/feature[@name=/"%1$s/"] " " with $t " "return $new " , ftname,tiname);

上面这段代码用到替换符,%n$,这种形式来自Single Unix Specification, 不被C标准支持。


你可能感兴趣的:(xml,数据库,db2,IBM,insert,扩展)