Условная вставка xquery не удалась с ошибкой неожиданной вставки, ожидая другого

Я пытаюсь выполнить xquery в базе данных Sedna, чтобы условно обновить контейнер, как показано ниже.

if(fn:exists(doc("blog")/entries/entry[@active="1" and @id="1"]/comments)) then
UPDATE insert <comment active="1"><name>sunil.s</name><email>[email protected]</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>[email protected]</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 вместо insert.

Может кто-нибудь, пожалуйста, помогите мне понять проблему с запросом и возможным решением?


person Xinus    schedule 21.10.2013    source источник


Ответы (1)


Ваш запрос предполагает существование выражения с синтаксисом вроде

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")/...

К сожалению, это повторяет условие «если»; неясно, предоставляет ли Sedna синтаксис для этого, например.

UPDATE
let $c := ...
insert
    if $c then <comment>...</comment> else <comments>...</comments>
into
    if $c then doc("blog")/.../comments else doc("blog")/...
person Michael Dyck    schedule 21.10.2013