Изменение содержимого XML в Oracle 11g r2

Я столкнулся с проблемой в Oracle XML DB (11g R2), как описано ниже:

Скажем, в таблице со столбцом XMLType с именем «xml_document» у меня есть следующий документ xml

<?xml encoding="utf-8" ?>
<books>
    <book>
        <author>AUTHORNAME1</author>
        <title>TITLE1</title>
        <price>12.33</price>
    </book>
    <book>
        <author>AUTHORNAME2</author>
        <title>TITLE2</title>
        <price>9.55</price>
    </book>
    <book>
        <author>AUTHORNAME3</author>
        <title>TITLE3</title>
        <price>15.00</price>
    </book>
</books>

Теперь я хочу заменить названия всех книг на «цена> 10» в качестве добавленного тега «-дорого».

' for $book in ora:view("XML_TABLE")//books/book where $book/price > 10 return replace value of node $book/title with concat($book/title/text(),"-expensive") '

Итак, после того, как я выполню запрос в Oracle SQLDeveloper, результирующий XML-контент будет следующим.

<?xml encoding="utf-8" ?>
<books>
    <book>
        <author>AUTHORNAME1</author>
        <title>TITLE1-expensive</title>
        <price>12.33</price>
    </book>
    <book>
        <author>AUTHORNAME2</author>
        <title>TITLE2</title>
        <price>9.55</price>
    </book>
    <book>
        <author>AUTHORNAME3</author>
        <title>TITLE3-expensive</title>
        <price>15.00</price>
    </book>
</books>

Я уже пытался сделать это с помощью процедур UPDATEXML(), XMLQUERY() и XMLTABLE() и все еще не могу сделать шаг вперед.

Любая помощь будет оценена.


person Semih Yagcioglu    schedule 09.11.2011    source источник
comment
Ваши фрагменты XML недействительны. Вам не хватает ? в конце объявления XML: <?xml encoding="utf-8" ?>. Также у вас есть несколько корневых элементов, может быть, вы хотите обернуть их в <books>[...]</books>?   -  person Jens Erat    schedule 10.11.2011


Ответы (1)


  • when не является оператором XQuery (хотя я не могу сказать об Oracle XQuery). Попробуйте where.
  • Конкатенация строк выполняется с помощью оператора concat(str1, [...], str2), а не оператора +.

Попробуйте этот запрос:

for $book in ora:view("XML_TABLE")//book
where $book/price > 10
return
  replace value of node $book/title
  with concat($book/title/text(), "-expensive")
person Jens Erat    schedule 09.11.2011
comment
извините за неправильный синтаксис. исправил, все равно не работает :) - person Semih Yagcioglu; 10.11.2011
comment
Я не уверен, что такое семантика ora:view. В документации говорится только, что он создает XML-представление реляционных данных, ничего об обновлениях. Я также не могу найти никакой информации об этом, к сожалению, не подтверждающей мои предположения. Думаю, вам придется создать постоянный XML view для использования XQuery Update. Запрос в моем ответе в порядке, я протестировал его с помощью BaseX (заменив ora:view). - person Jens Erat; 10.11.2011