Как вернуть результаты вместе с операциями обновления в BaseX?

Я это признала (insert/delete) -XQueries, выполняемые с клиентом BaseX, всегда возвращающим пустую строку. Я нахожу это очень запутанным или не интуитивным.

Есть ли способ выяснить, был ли запрос "успешным", без повторного запроса к базе данных (и с использованием потенциально глючной "транзитивной" логики типа "если я удалил узел, в XML должны быть узлы" oldNodeCount-1 "")?

1 ответ

Решение

Операторы XQuery Update ничего не возвращают - так они определены. Но вы не единственный, кому не нравятся эти ограничения, и BaseX добавил два способа обойти это ограничение:

Возвращение результатов

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

  • BaseX-специфичный update:output() функция устраняет этот пробел: она кэширует результаты своих аргументов во время выполнения и возвращает их после обработки всех обновлений. В следующем примере выполняется обновление и возвращается сообщение об успехе:

    update:output("Update successful."), insert node <c/> into doc('factbook')/mondial
    
  • С MIXUPDATES опция, все ограничения обновления будут отключены. Возвращенные узлы будут скопированы до того, как они будут изменены путем обновления выражений. Ошибка возникает, если элементы возвращаются в выражении преобразования.

Если вы хотите изменить узлы в основной памяти, вы можете использовать transform выражение

Выражение преобразования не поможет вам, так как вы, кажется, изменяете данные на диске. Включение MIXUPDATES позволяет одновременно обновлять документ и возвращать что-либо, например, запускать что-то вроде

let $node := <c/>
return ($node, insert node $node into doc('factbook')/mondial)

MIXUPDATES позволяет вернуть что-то, что может быть обработано в дальнейшем. Результаты копируются перед возвратом. Если вы выполняете несколько операций обновления и не получаете ожидаемых результатов, убедитесь, что у вас есть концепция отложенного списка обновлений.

db:output() Функция намеренно нарушает свой интерфейсный контракт: она определена как функция обновления (не имеет выходных данных), но в то же время печатает некоторую информацию для информации запроса. Вы не можете далее обрабатывать эти результаты, но вывод может помочь вам отладить некоторые проблемы.

Список ожидающих обновлений

В обоих случаях вы не сможете получить немедленный результат от обновления, вам придется что-то добавлять самостоятельно - и имейте в виду, что обновления не будут видны до тех пор, пока не будет применен ожидающий список обновлений, т.е. после завершения запроса.

Совместимость

Очевидно, что эти опции специфичны для BaseX. Если вам настоятельно требуется совместимый и стандартный XQuery, вы не можете использовать эти выражения.

Другие вопросы по тегам