使用Marklogic
在xquery
中需要这样的内容。
获取位置中的文档(如果不存在)使用xdmp:document-insert()
创建文档,然后使用fn:doc()
检索文档。
在第一次运行中,文档不存在。所以它创建了文档,但没有获取任何内容。在第二次运行中,检索在第一次运行中创建的文档。但是,我想在同一场比赛中做到这两点。
我知道我在这里缺少一些简单的东西。是单一交易的情况吗?这两个陈述都是分开的,因此不确定是单个交易案例。
declare function lk:createXmlIfNotPresent(){
let $xml_dir := "app/test"
let $xml_full_path := "app/test/test.xml"
let $dir_uri := cts:uri-match($xml_dir)
let $dir_creation :=
if(fn:empty($xml_dir)) then (
xdmp:directory-create($xml_dir)
)else()
let $exists := fn:doc-available($xml_full_path)
let $xml_creation :=
if($exists eq fn:false()) then (
xdmp:document-insert($xml_full_path,<root></root>,xdmp:default- permissions())
)else()
return fn:doc($xml_full_path)
};
答案 0 :(得分:3)
是的,这与交易有关。默认情况下,XQuery
程序的整个主体在单个事务中运行。与RDBMS
交易不同,在ML中,交易隐藏它的作用。在整个交易过程中,您对数据库的看法保持不变。只有在程序完成后,才会提交并显示更改。
您可以通过各种方式解决这个问题,我建议您使用本教程。
答案 1 :(得分:1)
虽然有关交易的建议适用于一般情况,但这种情况可以简单地处理。
您已将内存中的文档(示例中为&lt; root /&gt;)作为xdmp:document-insert()
的第二个参数。
您可以将文档分配给变量。将文档传递给xdmp:document-insert()
,并返回文档。
答案 2 :(得分:0)
如果要在同一次运行中同时使用xdmp:eval()函数来创建文档。