Базы данных Oracle - статьи


              

Преобразование из табличной формы в XMLTYPE


Для обратного преобразования удобно воспользоваться функциями, объединенными в стандарте SQL:2003 названием SQL/XML (другое название – SQLX).  В версии Oracle 9.2 реализованы следующие (не все) функции из этого стандартного набора:

- XMLElement

- XMLAttributes

- XMLAgg

- XMLConcat

- XMLForest

Вот некоторые примеры использования в схеме SCOTT:

SELECT XMLELEMENT("Employee", ename) FROM emp;

SELECT XMLELEMENT("Employee",

          XMLATTRIBUTES(ename AS "Name", empno AS "Number"))

FROM emp;

Обратите внимание, что в результатах выдаются поля типа XMLTYPE:

CREATE TABLE xtable (n) AS SELECT XMLELEMENT("Name", ename) FROM emp;

DESCRIBE xtable

Следующий пример – агрегирующей функции XMLAGG, допускающей использование в запросах с группировкой GROUP BY, подобно тому, как агрегирующие функции MIN, AVG и другие применяются для обычных данных, а не XMLTYPE:

SET LONG 2000

SELECT XMLELEMENT("department", XMLATTRIBUTES(deptno AS "no")),

       XMLAGG(XMLELEMENT("employee", ename))

FROM emp

GROUP BY deptno;

Интересно, что последний запрос допускает создания на своей основе выводимой таблицы, но не базовой:

CREATE VIEW xview (a, b) AS

SELECT XMLELEMENT("department", XMLATTRIBUTES(deptno AS "no")),

       XMLAGG(XMLELEMENT("employee", ename))

FROM emp

GROUP BY deptno;

(срабатывает)

CREATE TABLE xtable (a, b) AS

SELECT XMLELEMENT("department", XMLATTRIBUTES(deptno AS "no")),

       XMLAGG(XMLELEMENT("employee", ename))

FROM emp

GROUP BY deptno;

(ошибка !)

Это объясняется тем, что столбцы A и B в обоих случаях Oracle пытается создавать как XMLTYPE, а наши данные таковы, что в столбце B содержатся строго говоря некорректные строки XML, например

<employee>CLARK</employee><employee>KING</employee> ....

Однако в случае выводимой таблицы Oracle смотрит на это сквозь пальцы, а в случае базовой – нет.  Возможно это есть следствие определенной недоработанности некоторых областей технологий XML в Oracle, что вызвано чересчур быстрыми темпами развития этих технологий.




Содержание  Назад