[英]How to return results together with update operations in BaseX?
我认识到,用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,则不能使用这些表达式。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.