我认识到(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(使用前将#替换为@)