繁体   English   中英

如何在BaseX中返回结果以及更新操作?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM