17
March
2006

Использование 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 функции проигрывают по производительности.

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

12 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.

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

Александр
January 13, 2009 #

Отличная статья, все по существу.

Василий
May 5, 2009 #

Статья не хоро?ая, есть один вопрос, каким образом проводилось сравнение генерации ХМЛ Ораклом и генерации ХМЛ (хм например кем?) думаю если сравнивать с тем же ДОМ или Херекс то не так уж и медленно , а если все в строку писать то да скорость есть… хотя хотелось бы услы?ать ответ автора.

Leave a comment

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