条件插入xquery失败,错误“意外插入,期待其他”

时间:2013-10-21 02:01:34

标签: xquery sedna

我正在尝试在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中定义的语法的有效实例。细节:at   (2:8),语法错误,意外插入,期待其他

错误表明第二行中预计会else而不是insert

有人可以帮我理解查询问题和可能的解决方法吗?

1 个答案:

答案 0 :(得分:0)

您的查询假设存在一个语法类似

的表达式
UPDATE insert expr into expr

XQuery(或XQuery Update Facility)中没有这样的表达式。相反,它似乎是Sedn​​a支持的非标准语法。

但是,文档(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")/...