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

#xml #oracle #xquery #xmltable

#xml #Oracle #xquery #xmltable — таблица #xmltable

Вопрос:

Я столкнулся с проблемой в 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 () и все еще не могу сделать шаг вперед.

Будем признательны за любую помощь.

Комментарии:

1. Ваши XML-фрагменты недопустимы. Вам не хватает? в конце вашего XML-объявления: <?xml encoding="utf-8" ?> . Также у вас есть несколько корневых элементов, может быть, вы хотите обернуть их в <books>[...]</books> ?

Ответ №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")
  

Комментарии:

1. извините за неправильный синтаксис. я исправил это, хотя все еще не работает 🙂

2. Я не уверен, что такое семантика ora:view . В документации говорится только, что это создает представление XML для реляционных данных, ничего об обновлениях. Я также не могу найти никакой информации по этому поводу, к сожалению, ни одной, подтверждающей мои предположения. Я думаю, вам придется создать какое-то постоянное представление XML , чтобы использовать обновление XQuery. Запрос в моем ответе в порядке, я протестировал его с использованием BaseX (замена ora:view ).