如何在BaseX中返回结果和更新操作



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

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

XQueryUpdate语句不返回任何内容——它们就是这样定义的。但你并不是唯一一个不喜欢这些限制的人,BaseX添加了两种绕过这种限制的方法:

返回结果

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

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

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

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

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

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

MIXUPDATES允许您返回一些可以进一步处理的内容。结果在返回之前会被复制,如果您运行了多个更新操作,但没有得到预期的结果,请确保您得到了挂起更新列表的概念。

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

挂起的更新列表

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

兼容性

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

相关内容

  • 没有找到相关文章

最新更新