如何将结果与BaseX中的更新操作一起返回?

时间:2016-04-30 21:48:42

标签: xquery basex xquery-update

我认识到(insert / delete) - 使用BaseX客户端执行的XQueries总是返回一个空字符串。我发现这非常令人困惑或不直观。

有没有办法在不重新查询数据库的情况下查明查询是否“成功”(并使用潜在的错误“传递”逻辑,例如“如果我删除了一个节点,那么必须有'oldNodeCount-1'节点XML“)?

1 个答案:

答案 0 :(得分:3)

XQuery Update语句不返回任何内容 - 它们是如何定义的。但是,您并不是唯一一个不喜欢这些限制的人,BaseX added two ways around this limitation

  

返回结果

     

默认情况下,无法混合使用不同类型的表达式   在查询结果中。查询的最外层表达式必须是   更新或不更新表达式的集合。但是这里有   两种出路:

     
      
  • BaseX特定的update:output()函数填补了这个空白:它在运行时缓存其参数的结果并在之后返回它们   所有更新都已处理完毕。以下示例执行   更新并返回成功消息:

    update:output("Update successful."), insert node <c/> into doc('factbook')/mondial
    
  •   
  • 使用MIXUPDATES选项,将关闭所有更新约束。返回的节点在被修改之前将被复制   更新表达式。如果在其中返回项目,则会引发错误   变换表达式。

  •   
     

如果要修改主内存中的节点,可以使用transform expression

转换表达式对您没有帮助,因为您似乎修改了磁盘上的数据。启用MIXUPDATES允许您同时更新文档并返回内容,例如运行类似

的内容
let $node := <c/>
return ($node, insert node $node into doc('factbook')/mondial)

MIXUPDATES允许您返回可以进一步处理的内容。在返回之前复制结果,如果您运行多个更新操作但未获得预期结果,请确保获得pending update list的概念。

db:output()函数故意破坏其接口契约:它被定义为更新函数(没有任何输出),但同时它将一些信息输出到查询信息。您无法进一步处理这些结果,但输出可以帮助您调试某些问题。

待定更新列表

两种方式,你能够立即得到更新的结果,你必须自己添加一些东西 - 并且要知道在挂起的更新列表是应用,即。查询结束后。

兼容性

显然,这些选项是特定于BaseX的。如果您强烈要求兼容和标准XQuery,则不能使用这些表达式。