17
March

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

Posted in: Технологии XML, XPath, Базы данных, SQL, 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 функции проигрывают по производительности.

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

10 Comments »

RSS feed for comments on this post. TrackBack URI



wert2all
March 17, 2006 #

Та читаем, но пока ничего не могу покаментить, потому что не связан с этой отрастлью..
з.ы. малаццо…

Ольга
May 4, 2006 #

Огромное спасибо!
Вы не представляете, как мне помогла ваша статья!
Еще раз СПАСИБО!
С уважением, Ольга

kms
March 13, 2007 #

А что они делают со значениями полей, если они текстовые и в них встречается служебние символы XML - типа значки “больше”, “меньше”, слэши ?

poleksa
May 3, 2007 #

пол-дня парился с xml - все не так нужно было, а мне, оказывается нужен был XMLCOLATTVAL!
снкс

serg
September 26, 2007 #

коротко и понятно. спасибо. больше бы таких статей

October 1, 2007 #

Прошу уважаемую публику сравнить
SQL/XML с другим проектом SQL4/TML.

Буду очень благодарен за _любые_ соображения.

Igor
November 14, 2007 #

Большое спасибо, какраз то что надо.

Valery
March 26, 2008 #

Отличная статья, спасибо!
Но в процессе, так сказать, применения возникла трабла, а именно в запросе (столбец FOO имеет тип LONG):

SELECT XMLELEMENT(”foo”, t1.FOO) FROM TABLE1 t1;

выдает ошибку:
ORA-00932: inconsistent datatypes: expected NUMBER got LONG

может кто-нибудь знает как с этим бороться?

March 26, 2008 #

Тебе наверное нужно воспользоваться приведением типов. Вот ссылка, которая может помочь: CAST.

Valery
March 27, 2008 #

Спасибо за совет, но это не работает, вот почему:

CAST does not support LONG, LONG RAW, any of the LOB datatypes, or the Oracle-supplied types.

Взято из текста, по вашей ссылке.

Leave a comment

XHTML: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>