070495c0

XMLTYPE – объектный тип Oracle


Доказательством утверждения в заголовке служит создание следующей таблицы объектов типа XMLTYPE, «таблицы документов XML»:

CREATE TABLE xbooks OF XMLTYPE;

Работать с ними можно, как и с XML-атрибутом в обычной таблице:

INSERT INTO xbooks VALUES

   (XMLTYPE('<cover>

              <title>Oracle SQL*Loader</title>

              <author>Jonathan Gennick</author>

              <author>Sanjay Mishra</author>

              <pages>269</pages>

            </cover>'));

INSERT INTO xbooks VALUES

   (NEW XMLTYPE('<?xml version="1.0"?>

                 <cover>

                   <title>SQL*Plus Pocket Reference</title>

                   <author>Jonathan Gennick</author>

                   <pages>94</pages>

                 </cover>'));

В первом случае объект XML создается с помощью конструктора, а во втором, к тому же, используется оператор NEW.  Последний применяется в Oracle для работы с объектами, однако его использование носит лишь рекомендательный характер, так как в SQL он ничего содержательного не дает.



Далее:

SELECT * FROM xbooks;

SELECT VALUE(x) FROM xbooks x;

SELECT XMLDATA FROM xbooks;


Так же как для таблиц объектов прочих типов, элементы таблицы объектов XML имеют ссылки, то есть позволяют ссылаться на себя через REF в других типах и таблицах:

SELECT REF(x) FROM xbooks x;

SELECT DEREF(REF(x)) FROM xbooks x;

У этого типа нет свойств, но есть методы.  В этом можно убедиться, сделав запрос от имени SYS:

COLUMN text FORMAT A80

SELECT text

FROM user_source

WHERE name ='XMLTYPE' AND type='TYPE'

ORDER BY line;

Исследование каталога rdbms/admin позволяет обнаружить и исходное описание этого типа (но не его тела !) в файле dbmsxmlt.sql.  К сожалению в документации описания этих методов разбросаны по разным местам, не всегда последовательны и ясны.  Так например, EXTRACT и EXISTSNODE (о последней речь шла выше), возведены в ранг функций SQL, то есть описаны в книжке документации по SQL в разделе «Функции», в то время как из предыдущего запроса к словарю-справочнику следует, что это методы.  О том же говорит синтаксис употребления.  Для EXISTSNODE пример уже приводился, а для EXTRACT он может выглядеть так:

SELECT b.description.EXTRACT('/cover/title') FROM books b;

(Сравните с примером использования функции EXTRACTVALUE выше).

Вот некоторые другие примеры методов XMLTYPE:

SELECT b.description.GETCLOBVAL() FROM books b;

SELECT b.description.GETSTRINGVAL() FROM books b;

SELECT b.description.GETROOTELEMENT() FROM books b;

Обратите внимание, что некоторые методы XMLTYPE, например TOOBJECT, могут использоваться только процедурно, так как сами исполнены в виде процедур, а не функций.

Правда, объектность типа XMLTYPE реализована не в полной степени.  Так, попытка создать в таблице столбец из коллекции документов XML (вложенной таблицы или массива VARRAY) в версии 9.2 терпит неудачу.  Это относится только к БД; в PL/SQL этих проблем не возникает:

SQL> declare type xml_nt is table of xmltype index by varchar2(10);

  2  begin null; end;

  3  /

PL/SQL procedure successfully completed.


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