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

2023-12-09

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

有没有办法找出查询是否“成功”,而无需再次查询数据库(并使用可能有错误的“传递”逻辑,例如“如果我删除了一个节点,则 XML 中必须有 'oldNodeCount-1' 节点”) ?


XQuery Update 语句不返回任何内容——这就是它们的定义方式。但你并不是唯一一个不喜欢这些限制的人,而且BaseX 添加了两种方法来解决此限制:

返回结果

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

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

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

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

转换表达式不会帮助您,因为您似乎修改了数据on disk。启用MIXUPDATES允许您同时更新文档并返回某些内容,例如运行类似的内容

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

MIXUPDATES允许您返回可以进一步处理的东西。结果在返回之前被复制,如果您运行多个更新操作并且没有得到预期结果,请确保您了解待更新列表.

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

待更新列表

两种方式,你都会not为了能够立即从更新中获得结果,您必须自己添加一些内容 - 并且要注意,在应用挂起的更新列表之前,更新是不可见的,即。查询完成后。

兼容性

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐