【问题标题】:How to return results together with update operations in BaseX?如何在 BaseX 中将结果与更新操作一起返回?
【发布时间】:2016-04-30 21:48:42
【问题描述】:

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

有没有办法在不再次查询数据库的情况下确定查询是否“成功”(并使用可能存在错误的“传递”逻辑,例如“如果我删除了一个节点,则必须有 'oldNodeCount-1' 节点在XML")?

【问题讨论】:

  • 为什么不相信删除或插入会成功?
  • 我不能代表 OP,但是 永远不愿意相信删除或插入既成功又我想要的是“多年的痛苦经历”的原因"。
  • 如果 - 例如 - 在另一个删除尝试之前已经删除了一个元组。这可能是您想要了解的内容。 XQuery(路径表达式)只返回一个空字符串。 Idk 存在一个可以处理这个问题的 FLWOR 表达式。虽然这可以通过一些 if-then-else 来实现,但在某些情况下这肯定不是那么容易。在我看来,这应该改变..甚至是一个状态整数会比什么都没有的空字符串更好

标签: xquery basex xquery-update


【解决方案1】:

XQuery 更新语句不返回任何内容——这就是它们的定义方式。但你不是唯一一个不喜欢这些限制的人,BaseX added two ways around this limitation

返回结果

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

  • BaseX 特有的update:output() 函数弥补了这一差距:它在运行时缓存其参数的结果并在之后返回它们 所有更新均已处理。下面的示例执行一个 更新并返回成功消息:

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

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

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

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

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

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

待更新列表

两种方式,您将能够从更新中立即获得结果,您必须自己添加一些东西 - 并且要注意在待定更新列表出现之前更新是不可见的应用,即。查询完成后。

兼容性

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

【讨论】:

  • 我认为这就足够了。我稍后再看。谢谢
猜你喜欢
  • 1970-01-01
  • 2015-07-19
  • 2015-06-17
  • 2021-01-02
  • 2016-01-03
  • 1970-01-01
  • 1970-01-01
  • 2020-10-23
  • 2021-10-23
相关资源
最近更新 更多