2013-10-21 60 views
0

我想執行的塞德娜數據庫中的XQuery來有條件地更新容器,如下條件插入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>[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消息:錯誤XPST0003如果表達式爲 不是A.1 EBNF中定義的語法的有效實例,則爲靜態錯誤。詳細說明:在 (2:8),語法錯誤,意想不到的插入,期待其他

該錯誤表明它在第二行的期待代替elseinsert

有人可以幫我理解查詢和可能的修復問題嗎?

回答

0

您所查詢的假定與語法表達式的像

UPDATE insert expr into expr 

存在有XQuery中沒有這樣的表達(或者XQuery更新設施)。相反,它似乎是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")/... 

不幸的是,這種重複「如果」的條件;目前尚不清楚塞德娜是否提供了分解因子的語法,例如

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