0

我正在尝试在 Sedna 数据库上执行 xquery 以有条件地更新容器,如下所示

if(fn:exists(doc("blog")/entries/entry[@active="1" and @id="1"]/comments)) then
UPDATE insert <comment active="1"><name>sunil.s</name><email>suni.l.s@gmail.com</email><desc>desbbh</desc></comment> into doc("blog")/entries/entry[@active="1" and @id="1"]/comments
else
UPDATE insert <comments><comment active="1"><name>sunil.s</name><email>sunil.s@gmail.com</email><desc>sdd</desc></comment></comments> into doc("blog")/entries/entry[@active="1" and @id="1"]

但是这个查询总是失败并出现以下错误

SEDNA 消息:ERROR XPST0003 如果表达式不是 A.1 EBNF 中定义的语法的有效实例,则为静态错误。详细信息:在 (2:8)、语法错误、意外插入、期待 else

该错误表明它正在预期else而不是insert在第二行中。

有人可以帮我理解查询的问题和可能的修复吗?

4

1 回答 1

0

您的查询假定存在一个具有类似语法的表达式

UPDATE insert expr into expr

XQuery(或 XQuery 更新工具)中没有这样的表达式。相反,它似乎是 Sedna 支持的非标准语法。

但是,文档(http://www.sedna.org/progguide/ProgGuidesu6.html#x12-430002.3)将其称为“声明”,而不是“表达式”,表明它必须是“顶级' (最外层)在您的查询中构造。

为此,您可以将查询重写为:

UPDATE
insert
    if ... then <comment>...</comment> else <comments>...</comments>
into
    if ... then doc("blog")/.../comments else doc("blog")/...

不幸的是,这重复了“if”条件;目前尚不清楚 Sedna 是否提供了一种将其分解的语法,例如

UPDATE
let $c := ...
insert
    if $c then <comment>...</comment> else <comments>...</comments>
into
    if $c then doc("blog")/.../comments else doc("blog")/...
于 2013-10-21T17:59:48.423 回答