Javenue logo

Javenue

Программирование на Java

Информационные технологии

Использование SQL/XML функций в Oracle

Начиная с девятой версии, Oracle предоставляет набор XML-related функций. Используя эти функции в запросах к реляционным данным можно получить данные в формате XML.

В данной статье я хочу описать SQL/XML функции Oracle (9i и выше), которые встречаются наиболее часто. Итак...

Функция XMLElement в качестве параметров принимает имя результирующего элемента, его аттрибуты (опционально) и аргумент, который представляет содержимое результирующего элемента. Для отображения атрибутов тэга используется функция XMLATTRIBUTES.

Для наглядности, предположим, что у нас есть таблица MY_POSTS со статьями для некоторого сайта/блога. У таблицы есть следующие колонки: ID, TITLE, CATEGORY, EXT_TITLE, TAGS.

Сконструируем следующий запрос:

SELECT XMLELEMENT(“post”,
    XMLATTRIBUTES(e.ID, e.TAGS),
    XMLELEMENT(“title”, e.TITLE),
    XMLELEMENT(“category”, e.CATEGORY))
FROM MY_POSTS e
WHERE e.ID = 13;

Результат выполнения запроса будет таким:

<post ID=“13” TAGS=“Oracle,SQL,XML”>
    <title>Oracle SQL/XML functions</title>
    <category>RDBMS</category>
</post>

Функция XMLCOLATTVAL создает набор элементов "column" с атрибутами "name":

SELECT XMLELEMENT(“post”,
    XMLCOLATTVAL(e.ID, e.TITLE, e.EXT_TITLE))
FROM MY_POSTS e
WHERE ID = 10;

В результате получим:

<post>
    <column name=“ID”>10</column>
    <column name=“TITLE”>
        Oracle SQL/XML functions
    </column>
    <column name=“EXT_TITLE”>
        Using SQL2XML functions in Oracle
    </column>
</post>

XMLAgg - агрегационная функция. Как и любая другая функция этого типа, часто употребляется с конструкцией GROUP BY. А вот и пример использования:

SELECT XMLELEMENT(“posts”,
    XMLAGG(XMLELEMENT(“post”, e.TITLE)))
FROM MY_POSTS e
GROUP BY e.CATEGORY;

И результат:

<posts>
  <post>Oracle SQL/XML functions</post>
</posts>
<posts>
  <post>RDBMS Overview</post>
  <post>Oracle Types</post>
</posts>

Еще одна распространенная функция - XMLFOREST. Она преобразует каждый элемент, указанный в качестве параметра, в отдельный тэг:

SELECT XMLELEMENT(“post”, 
    XMLFOREST(e.ID, e.TITLE, e.EXT_TITLE))
FROM MY_POSTS e
WHERE ID = 9;

Результат выполнения:

<post>
    <ID>9</ID>
    <TITLE>Oracle SQL/XML functions</TITLE>
    <EXT_TITLE>
        Using SQL2XML functions in Oracle
    </EXT_TITLE>
</post>

Недавно проводил исследование: сравнение производительности XML функций и генерации XML "на лету". Результаты исследования заслуживают отдельной статьи. Хотя, скажу вам такую вещь: как это не прискорбно, но XML функции проигрывают по производительности.

Надеюсь, статья вам понравилась. Жду ваших вопросов и замечаний.



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

  Выйти

  * для публикации комментариев нужно