此问题与Data Hub Framework有关-
我有3-4种条件,在这些条件下,我会进行xdmp:node-replace
和xdmp:document-delete
之类的操作,而在所有条件下,我都试图使用xdmp:document-insert
插入文档。
当我通过注释其他条件独立运行条件时,它可以正常工作,但是如果我尝试同时运行2个或更多条件,我会得到 XDMP-CONFLICTINGUPDATES
$envelope is coming from STAGING Database which i am using in writer.xqy
代码示例如下-
let $con1 := if($envelope/*:test/text() eq "abc")
then xdmp:node-replace(....) else ()
let $con2 := if($envelope/*:test/text() eq "123")
then xdmp:node-replace(....) else ()
let $con1 := if($envelope/*:test/text() eq "cde")
then xdmp:document-delete(....) else ()
return if($envelope//*FLAG/text() eq "1")
then
xdmp:document-insert($id, $envelope, xdmp:default-permissions(), map:get($options, "entity"))
有什么建议吗?
答案 0 :(得分:4)
XDMP-ConflictingUpdates
表示您试图在同一笔交易中多次更新同一节点。解决这类错误可能非常棘手,并且对每个MarkLogician来说都是通行证。
在您的情况下,这是由于使用xdmp:node-replace
更新了一个节点,然后使用xdmp:document-insert
更新了作为该节点的父级的文档节点。因此,由于要同时更新节点及其父节点,因此实际上是两次更新该节点,从而导致错误。或者,这也可能是由于试图在同一事务中以相同URI删除和插入文档而引起的。
这是一个简单的查询,您可以在QConsole中运行以重现此行为:
xquery version "1.0-ml";
xdmp:document-insert("/test.xml", <test><value></value></test>);
xquery version "1.0-ml";
let $d := fn:doc("/test.xml")
let $_ := xdmp:node-replace($d//value, <value>test</value>)
return
xdmp:document-insert("/test.xml", $d)
在本示例以及您的代码中,xdmp:document-insert
是多余的,可以简单地将其删除。
答案 1 :(得分:4)
就像上面的XQuery语句一样,正在尝试对同一单语句事务中的同一节点进行多次更新。 xdmp:node-replace
调用在每次操作时都对同一节点执行更新。有关更多详细信息,请参见documentation。
以下两种可能对您有用的解决方案
答案 2 :(得分:1)
复杂更新的一种一般可能性:使用XSLT。
答案 3 :(得分:0)
这是多笔交易对帐单。在您的情况下有多种处理方式: