我认识到使用 BaseX 客户端执行的 ( insert
/ delete
)-XQueries 总是返回一个空字符串。我觉得这非常令人困惑或不直观。
有没有办法在不再次查询数据库的情况下确定查询是否“成功”(并使用可能有问题的“传递”逻辑,例如“如果我删除了一个节点,XML 中必须有 'oldNodeCount-1' 节点”) ?
我认识到使用 BaseX 客户端执行的 ( insert
/ delete
)-XQueries 总是返回一个空字符串。我觉得这非常令人困惑或不直观。
有没有办法在不再次查询数据库的情况下确定查询是否“成功”(并使用可能有问题的“传递”逻辑,例如“如果我删除了一个节点,XML 中必须有 'oldNodeCount-1' 节点”) ?
XQuery Update 语句不返回任何内容——这就是它们的定义方式。但是你不是唯一一个不喜欢这些限制的人,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,则不能使用这些表达式。