[经验总结]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代码吧。

view plaincopy to clipboardprint?

   1. snprintf(xupdate,MAX_XUPDATE,  
   2.            "copy $new := $DOC "  
   3.            "modify "  
   4.            "if (fn:not($new/tissue_information/tissue[@name="%2$s"])) "  
   5.            "then do insert                   "  
   6.            "                   "  
   7.            "    {$t}   "  
   8.            "
                                   "  
   9.            " into $new/tissue_information                "  
  10.            "else if(fn:not($new/tissue_information/tissue[@name="%2$s"]/feature[@name="%1$s"])) "  
  11.            "then do insert                               "  
  12.            "  {$t}     "  
  13.            " into $new/tissue_information/tissue[@name="%2$s"] "  
  14.            "else do replace                  "  
  15.            "                value of $new/tissue_information/tissue[@name="%2$s"]/feature[@name="%1$s"] "  
  16.            "     with $t "   
  17.            "return  $new "  
  18.            , ftname,tiname);  

snprintf(xupdate,MAX_XUPDATE, "copy $new := $DOC " "modify " "if (fn:not($new/tissue_information/tissue[@name="%2$s"])) " "then do insert " " " " {$t} " " " " into $new/tissue_information " "else if(fn:not($new/tissue_information/tissue[@name="%2$s"]/feature[@name="%1$s"])) " "then do insert " " {$t} " " 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标准支持。
参与1

0同行回答

“答”则兼济天下,请您为题主分忧!

提问者

相关问题

相关资料

相关文章

问题状态

  • 发布时间:2010-11-02
  • 关注会员:1 人
  • 问题浏览:2609
  • X社区推广