来自sql绑定参数的MarkLogic Optic API

来自sql绑定参数的MarkLogic Optic API,marklogic,Marklogic,我正在尝试使用来自sql和XQuery的Optical API。我发现这是一种获取所需数据的好方法,但我试图找到使用op:fromsql将参数传递给占位符的清晰示例 比如说 let $result := op:from-sql(' SELECT name, sum(value) FROM db.namevalue WHERE client=''IBM''

我正在尝试使用来自sql和XQuery的Optical API。我发现这是一种获取所需数据的好方法,但我试图找到使用op:fromsql将参数传递给占位符的清晰示例

比如说

let $result := op:from-sql('
                  SELECT name, sum(value) 
                  FROM db.namevalue
                  WHERE client=''IBM''
                    and department in (''IT'', ''ACCOUNTS'')
                  GROUP BY name
                  ORDER BY 2 DESC
                  limit 30
               ')
             => op:result()
return $result 
很好地工作,并给出了我期望的结果

我需要通过它来参数化,这样我就可以使用变量而不是文字。 我见过op:param,但我怀疑它不是用来指定占位符的,比如?在传统的SQL环境中

我知道这是错的

let $client  = "IBM
let $dept    = ("IT", "ACCOUNT")

let $result := op:from-sql('
                  SELECT name, sum(value) 
                  FROM db.namevalue
                  WHERE client=?
                    and department in (?)
                  GROUP BY name
                  ORDER BY 2 DESC
                  limit 30
               ')
             => op:result((), map:entry("$1", $client) => map:entry("$2", $dept))
return $result 
那么,有没有一个明确的例子可以说明我是如何做到这一点的

谢谢


Stephen在SQL字符串中使用@作为前缀有效吗?例如:

op:from-sql('
              SELECT name, sum(value) 
              FROM db.namevalue
              WHERE client=@client and department in (@department)
              GROUP BY name
              ORDER BY 2 DESC
              limit 30
           ')
         => op:result((),
             map:entry("client", $client)
             => map:with("department", $dept))
另一种方法是使用Optic builder方法表示固定结构,并沿以下未测试草图的线条参数化整个SQL条件:

op:from-view('db', 'namevalue')
    => op:where(op:sql-condition(op:param("condition")))
    => op:group-by("name", op:sum("valueSum", "value"))
    => op:order-by(op:desc("valueSum"))
    => op:limit(30)
    => op:result((), map:entry("condition", $condition))

希望这能有所帮助,

看起来两者都不起作用。@just返回声明变量$clientId external;——未定义的外部变量fn:QName(“,”clientId“),第二个示例返回XDMP-AS:(err:XPTY0004)$expression AS xs:string--无效的强制:map:map()AS xs:stringSQL字符串中嵌入的@name与带有绑定的映射中的name不匹配时发生@error。当名称不同时,我得到相同的错误。当名称相同时,我不会得到错误。第二个例子似乎是op:sql-condition()中的一个bug。