【问题标题】:Avoiding redeclaration for transactions in Xquery避免在 Xquery 中重新声明事务
【发布时间】:2013-08-07 16:18:29
【问题描述】:

给定:

let $name := '751-1500'    
return xdmp:node-delete(doc(concat('/', $name, '.xml'))//foo);

let $name := '751-1500'
return xdmp:node-delete(doc(concat('/', $name, '.xml'))//bar);

let $name := '751-1500'
return xdmp:node-delete(doc(concat('/', $name, '.xml'))//baz);

如何避免重新声明 $name?

【问题讨论】:

  • 您使用的是什么 XQuery 处理器? $name 真的需要是变量吗?
  • MarkLogic 6 (XQuery 3)。出于示例的目的,我希望 $name 是一个变量。

标签: transactions xquery marklogic


【解决方案1】:

在一个事务中,有更简单的方法,但这应该可以工作(未经测试)

let $name := '751-1500'     
let $doc := doc(concat('/', $name, '.xml'))
return 
(xdmp:node-delete($doc//foo),
 xdmp:node-delete($doc//bar),
 xdmp:node-delete($doc//baz))

【讨论】:

    【解决方案2】:

    使用单独的事务我不确定是否有很好的方法来做到这一点。但是您可以将变量声明为外部变量。它仍然需要多次声明,但您只需在通过xdmp:invoke(或xdmp:eval)调用时分配一次:

    declare variable $name as xs:string external ;
    xdmp:node-delete(doc(concat('/', $name, '.xml'))//foo);
    
    declare variable $name as xs:string external ;    
    xdmp:node-delete(doc(concat('/', $name, '.xml'))//bar);
    
    declare variable $name as xs:string external ;
    xdmp:node-delete(doc(concat('/', $name, '.xml'))//baz);
    

    然后您可以使用invoke 多次调用此模块,并使用不同的值:

    xdmp:invoke('delete-nodes.xqy', (xs:QName('name'), '751-1500')),
    xdmp:invoke('delete-nodes.xqy', (xs:QName('name'), '751-1501')),
    xdmp:invoke('delete-nodes.xqy', (xs:QName('name'), '751-1502'))
    

    如果您不想要额外的模块,您可以将其全部包装在一个接受 $name 参数并改用 xdmp:eval 的函数中。

    【讨论】:

    • 好的,谢谢。有没有办法在单个事务中实现我的示例?
    • 是的,但是从您示例中的分号来看,我假设您正在使用多个事务。您可以使用多语句事务(ML6 中的新功能),它将执行多个事务并以原子方式提交它们。或者,如果您没有从连续的xdmp:node-deletes 中获得冲突更新,则只需声明一次$name,并省略分号。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    相关资源
    最近更新 更多