March
Начиная с девятой версии, 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
Та читаем, но пока ничего не могу покаментить, потому что не связан с этой отрастлью..
з.ы. малаццо…
Огромное спасибо!
Вы не представляете, как мне помогла ваша статья!
Еще раз СПАСИБО!
С уважением, Ольга
А что они делают со значениями полей, если они текстовые и в них встречается служебние символы XML - типа значки “больше”, “меньше”, слэши ?
пол-дня парился с xml - все не так нужно было, а мне, оказывается нужен был XMLCOLATTVAL!
снкс
коротко и понятно. спасибо. больше бы таких статей
Прошу уважаемую публику сравнить
SQL/XML с другим проектом SQL4/TML.
Буду очень благодарен за _любые_ соображения.
Большое спасибо, какраз то что надо.
Отличная статья, спасибо!
Но в процессе, так сказать, применения возникла трабла, а именно в запросе (столбец FOO имеет тип LONG):
SELECT XMLELEMENT(”foo”, t1.FOO) FROM TABLE1 t1;
выдает ошибку:
ORA-00932: inconsistent datatypes: expected NUMBER got LONG
может кто-нибудь знает как с этим бороться?
Спасибо за совет, но это не работает, вот почему:
CAST does not support LONG, LONG RAW, any of the LOB datatypes, or the Oracle-supplied types.
Взято из текста, по вашей ссылке.