我认识到(insert
/ delete
) - 使用BaseX客户端执行的XQueries总是返回一个空字符串。我发现这非常令人困惑或不直观。
有没有办法在不重新查询数据库的情况下查明查询是否“成功”(并使用潜在的错误“传递”逻辑,例如“如果我删除了一个节点,那么必须有'oldNodeCount-1'节点XML“)?
答案 0 :(得分:3)
XQuery Update语句不返回任何内容 - 它们是如何定义的。但是,您并不是唯一一个不喜欢这些限制的人,BaseX added two ways around this limitation:
返回结果
默认情况下,无法混合使用不同类型的表达式 在查询结果中。查询的最外层表达式必须是 更新或不更新表达式的集合。但是这里有 两种出路:
BaseX特定的
update:output()
函数填补了这个空白:它在运行时缓存其参数的结果并在之后返回它们 所有更新都已处理完毕。以下示例执行 更新并返回成功消息:update:output("Update successful."), insert node <c/> into doc('factbook')/mondial
使用
MIXUPDATES
选项,将关闭所有更新约束。返回的节点在被修改之前将被复制 更新表达式。如果在其中返回项目,则会引发错误 变换表达式。如果要修改主内存中的节点,可以使用
transform
expression。
转换表达式对您没有帮助,因为您似乎修改了磁盘上的数据。启用MIXUPDATES
允许您同时更新文档并返回内容,例如运行类似
let $node := <c/>
return ($node, insert node $node into doc('factbook')/mondial)
MIXUPDATES
允许您返回可以进一步处理的内容。在返回之前复制结果,如果您运行多个更新操作但未获得预期结果,请确保获得pending update list的概念。
db:output()
函数故意破坏其接口契约:它被定义为更新函数(没有任何输出),但同时它将一些信息输出到查询信息。您无法进一步处理这些结果,但输出可以帮助您调试某些问题。
两种方式,你不能够立即得到更新的结果,你必须自己添加一些东西 - 并且要知道在挂起的更新列表是应用,即。查询结束后。
显然,这些选项是特定于BaseX的。如果您强烈要求兼容和标准XQuery,则不能使用这些表达式。