我发现用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,则不能使用这些表达式。