Xquery 如何通过提供在运行时计算其值的变量来计算查询?

Xquery 如何通过提供在运行时计算其值的变量来计算查询?,xquery,marklogic,Xquery,Marklogic,我有一段代码,希望返回特定林中的文档总数。我想确定林文档计数是否为0或更多 declare function local:forest-doc-count($db-name, $f-id as xs:unsignedLong) as xs:integer { let $_ := xdmp:log(xdmp:describe(fn:concat("$db-name -->", $db-name), (),(

我有一段代码,希望返回特定林中的文档总数。我想确定林文档计数是否为0或更多

 declare function local:forest-doc-count($db-name,
                                        $f-id as xs:unsignedLong) as xs:integer {
  let $_ := xdmp:log(xdmp:describe(fn:concat("$db-name -->", $db-name), (),()))                    
    let $query := 'xquery version "1.0-ml";
                    declare variable $f-id as xs:unsignedLong external;
                   xdmp:estimate(cts:search(fn:doc(), (), (), (), $f-id))'
    let $count := xdmp:eval($query , (),
                    map:entry("f-id",   $f-id),
                    map:entry("database", xdmp:database($db-name))
                    )
    return $count
};
其中,$f-id是林id,$db name是数据库名称。现在我有点累了

未定义变量$f-id


在查询中声明外部变量,然后在调用中将值绑定到外部变量

下面的草图未经测试,但沿着这些线应该可以工作:

declare function local:forest-doc-count(
    $db-name as xs:string,
    $f-id    as xs:unsignedLong
) as xs:integer {
    xdmp:eval(
        'xquery version "1.0-ml";
         declare variable $f-id as xs:unsignedLong external;
         xdmp:estimate(cts:search(fn:doc(), (), (), (), $f-id))',
        map:entry("f-id",     $f-id),
        map:entry("database", xdmp:database($db-name))
        )
};
脚注:当参数和返回值确定时,您可能希望声明它们的类型,以利用类型检查


希望这会有用,

在查询中声明一个外部变量,然后在调用中将一个值绑定到外部变量

下面的草图未经测试,但沿着这些线应该可以工作:

declare function local:forest-doc-count(
    $db-name as xs:string,
    $f-id    as xs:unsignedLong
) as xs:integer {
    xdmp:eval(
        'xquery version "1.0-ml";
         declare variable $f-id as xs:unsignedLong external;
         xdmp:estimate(cts:search(fn:doc(), (), (), (), $f-id))',
        map:entry("f-id",     $f-id),
        map:entry("database", xdmp:database($db-name))
        )
};
脚注:当参数和返回值确定时,您可能希望声明它们的类型,以利用类型检查


希望这有用,arg4不是xs:string类型。这就是我收到的。我在代码中修正了两个拼写错误。你真的照抄了吗?这样对我来说很好,当使用
local:forest doc count(xdmp:database name(xdmp:database())、xdmp:database-forests(xdmp:database())[1])调用它时,
No我没有直接复制粘贴它。对我来说,它不起作用。我甚至放了一个日志并检查了错误日志。我看到$db name的字符串。我仍然收到相同的错误
arg4不是xs:string类型的。我已经更新了代码,所以现在你仍然可以进一步检查错误。哦!好了,现在对我有用了。我刚刚删除了xdmp:eval中的第二个参数,它正在工作。但是如果有人能详细说明我的错误作为第二个参数,我将不胜感激,也就是说,空序列是可选的,那么它有什么错呢?第二个参数是外部变量运行时定义。将外部变量声明添加到要求值的查询后,它不再是可选的。arg4不是xs:string类型。这就是我收到的。我在代码中修正了两个拼写错误。你真的照抄了吗?这样对我来说很好,当使用
local:forest doc count(xdmp:database name(xdmp:database())、xdmp:database-forests(xdmp:database())[1])调用它时,
No我没有直接复制粘贴它。对我来说,它不起作用。我甚至放了一个日志并检查了错误日志。我看到$db name的字符串。我仍然收到相同的错误
arg4不是xs:string类型的。我已经更新了代码,所以现在你仍然可以进一步检查错误。哦!好了,现在对我有用了。我刚刚删除了xdmp:eval中的第二个参数,它正在工作。但是如果有人能详细说明我的错误作为第二个参数,我将不胜感激,也就是说,空序列是可选的,那么它有什么错呢?第二个参数是外部变量运行时定义。一旦将外部变量声明添加到要求值的查询中,它就不再是可选的了。