Классика баз данных - статьи

       

Как уже отмечалось выше, функциональное


Как уже отмечалось выше, функциональное update-выражение может возвращать любые данные из модели данных языка XQuery. В предыдущих примерах результатом вычисления выражений были последовательности узлов элементов XML-документа. Необходимо подчеркнуть, что функциональное update-выражение может возвращать и узел документа. Предыдущий пример (Запрос 4), модифицированный соответствующим образом, представлен ниже (Запрос 5).

let $euro-rate:=doc("rates")/rates/rate[@name="euro"]/text() for $orders in doc("orders.xml") transform replace $p in $orders/orders/order/orderLine/price with <price>{$p/text()*$euro-rate}</price>

Запрос 5. Получение узла XML-документа orders.xml с конвертированной ценой с использованием функциональных update-выражений

Функциональные update-выражения естественным образом расширяют язык XQuery и не нарушают его замкнутости. В сложных XQuery-запросах, update-выражения с функциональной семантикой могут участвовать равноправно по отношению к выражениями языка XQuery. Благодаря этому принципиальной особенностью расширения языка XQuery функциональными update-выражениями является доступность в одном XQuery-выражении как исходного, так и модифицированного состояния XML-данных.

Последняя возможность может требоваться в целом ряде случаев . Например, такая потребность возникает при необходимости произвести некоторую аналитику над возможным изменением данных, то есть проанализировать изменения по отношению к текущему состоянию данных относительно некоторого модифицированного состояния.

В примере Запрос 6 выражение на расширенном языке конструирует сводные XML-данные над исходным и модифицированным состояниями данных. Несмотря на то, что этот запрос может быть относительно просто выражен средствами языка XQuery, в практических приложениях его запись в представленном виде может быть более приемлемой.

let $euro-rate:=document("stock")/rates/euro/text() let $orders:=document("orders")/orders/order let $new-orders:=for $o in document("orders")/orders/order transform replace $p in $o//price with <price> {$p/@euro-price/text() * $euro-rate} </price>

return <price-change> <initial>{sum($orders/price/text()}</initial> <new>{sum($new-orders/price/text()}</new> </price-change>

Запрос 6. Использование в одном запросе исходного и модифицированного состояний данных


Содержание  Назад  Вперед