Oracle тип данных xml
Казалось бы, зачем вообще может возникнуть необходимость разбирать XML на стороне БД?
В этой статье я хотел бы продемонстрировать на сколько легко и непринужденно можно разобрать XML различной степени сложности используя инструментальные средства Oracle Database.
Мне совершенно не хотелось бы здесь касаться DOM парсера. Скажу лишь, что он есть, реализуется пакетом DBMS_XMLDOM. Временами он может оказаться крайне полезным разработчику, а разобраться с ним, не составит труда любому, сталкивавшемуся ранее с DOM парсерами от других производителей.
Инновационной особенностью оракла является тип XMLType и средства работы с ним. Этот тип является частью технологии XML DB, которая включена в поставку Oracle Database начиная с версии 9.2.
Исходный текст документа XML может быть передан конструктору XMLType в виде значений типов CLOB, BLOB, VARCHAR2, BFILE. Пожалуй, стоит отметить, что BFILE позволяет загрузить файл с файловой системы сервера — никак не клиента, потому если наш XML находится на стороне клиента и он достаточно велик, чтобы быть переданным в виде строки в запросе, пожалуй, следует озаботиться возможностью доставки файла с XML содержимым на файловую систему сервера.
Пример создания экземпляра XMLType, с содержимым, передаваемым в строке:
Создав экземпляр XMLType, можно попытаться сделать первые робкие шажки для разбора нашего XML. Тип XMLType реализует метод Extract, который, принимая XPatch выражение, возвращает фрагмент XML, сочетающийся с этим выражением. Фрагмент XML (XML Fragment), в отличии от правильно построенного XML (whellformed XML) допускает отсутствие корневого элемента (или же, другими словами, допускающий более одного корневого элемента в своем составе).
Так в примере ниже, три выражения возвращают три фрагмента XML. Первый возвращает все вхождения элемента word, второй возвращает только первое его вхождение, третий возвращает фрагмент текстового содержимого элемента word, для которого значение атрибута seq равняется двум.
Здесь, думаю, стоит поставить жирный акцент на том, что в третьем случае возвращается именно фрагмент XML, никак не значение этого элемента. Различия станут заметны лишь тогда, когда это значение будет содержать подстановочные (escaped) символы, вроде &,>. Для того, чтобы получить значение элемента, следует использовать функцию extractValue. Тут упомяну, что основные методы XMLType, продублированы SQL функциями, или же наоборот, основные функции работы с XMLType реализованы в виде его методов. Однако extractValue — исключение. extractValue представлена только в виде фунации. XMLType, к сожалению, не реализует метод extractValue.
Пожалуй, следует еще упомянуть о правилах работы с пространствами имен. Не всякого интуиция приводит к верному пониманию этих механизмов работы. Функции (и метод) extract, extractValue, как один из параметров принимают описание пространства имен. Описанные в этом параметре пространства имен могут быть использованы в XPath выражении. И именно это я хочу подчеркнуть особо. Обратите внимание на третий случай. Пространства имен в XML и XPatch выражениях имеют разные псевдонимы, но одинаковые URI, потому разбор происходит успешно.
Итак, научившись извлекать значения, теперь следовало бы научиться их разделять. Напомню, в первом случае, для первого примера, мы пытались выбрать все элементы word из XML, и нам это удалось, мы получили два элемента word, однако получили мы их в одном фрагменте. Для того, чтобы представить фрагмент, содержащий несколько корневых элементов в виде последовательности фрагментов, каждый из которых содержит по одному корневому элементу существует конвейерная (pipelined) функция XMLSeqence. Функция возвращает XMLSequenceType, который представляет собой таблицу значений XMLType.
Если вдруг кто запамятовал, напомню, что конвейерные функции возвращают как бы коллекции, потому при вызове оборачиваются выражением table. К результатам этих функций обращаются, используя виртуальный столбец column_value, либо же выражение value(), а потому для табличного выражения(table collection excpression) следует определить псевдоним. Если вдруг кто и не знал этого, рекомендую заучить это как мантру, понимание придет со временем, и то, лишь если понадобится.
Простейший пример использования XMLSequence:
Попытаюсь проговорить что здесь происходит, хоть и опасаюсь, что по-русски это окажется намного более сумбурно, и куда менее понятно, нежели на SQL. В выражении from мы сначала создаем экземпляр XMLType, передавая ему строку, содержащую текст XML. Далее, используя метод extract, мы извлекаем в один фрагмент все элементы b, которые содержит элемент а. Полученный фрагмент XML передается параметром в конвейерную функцию XMLSequence, для вызова которой, согласно правилам грамматики, используется предложение table. Набору записей, описываемым этим предложением, присваивается псевдоним t. В select-list'e мы получаем экземпляр объекта возвращенного табличным выражением t, он у нас имеет тип XMLType. Для каждой строки возвращаемой табличным выражением этот экземпляр содержит один фрагмент элемента b исходного XML. Передаем этот объект в качестве параметра функции extractValue. Результат — на лицо.
На самом деле, все далеко не так сложно, как получается в моем изложении. К этому достаточно лишь малость привыкнуть. Но насилие над мозгом еще не в полной степени завершено. То, что у нас получилось на данном этапе, работает только для одного XML документа. Если у нас исходный текст нескольких XML лежит в табличке и нам нужно разобрать сразу несколько из них, нам придется вспомнить еще что такое левая корреляция (left correlation). Здесь тоже нет ничего военного. Эта штука придумана Ораклом и специально для табличных выражений (table collection expression). Суть сводится к тому, что в табличном выражении могут использоваться значения (столбцы) из наборов данных, определенных в выражении from перед (слева) от самого табличного выражения. На практике это выглядит совсем не так ужасно, как на слух:
Здесь в табличном выражении t используется значение xml таблицы demo3. Выражение будет вычислено для каждой строки таблицы demo3. Это и есть то самое, что называется таким вычурным словом — левая корреляция.
Описанного функционала вполне достаточно, чтобы разобрать XML практически любой сложности. Этими средствами нельзя разобрать, пожалуй, лишь иерархически представленные данные заведомо неизвестной глубины вложенности. Для разбора подобных структур придется прибегнуть к XSLT, чтобы привести XML к более удобочитаемому виду. XSLT преобразование осуществляется функцией XMLTransform, которая в качестве первого параметра принимает XMLType исходного документа, второго XMLType XSL шаблона, а возвращает XMLType результата преобразования.
В принципе, на этом с теорией можно и закончить. В завершение лишь продемонстрирую пример извлечения элементов с разных уровней вложенностей XML. У новичков это, порой, вызывает сложности.
Как видите, здесь нет ничего нового. Все та же левая корреляция. Единственное, на что хотелось бы обратить внимание, на (+) в конце табличного выражения subdtl. Как, наверное, не сложно догадаться, он обозначает, что следует использовать внешнее соединение. Если бы мы его не указали, мы не получили бы строки с detail 3.
Итак, что же предстало пред нашими глазами? Мы имеем один объектный тип, сравнительно ограниченный набор функций, дающий практически не ограниченный набор возможностей. Мне безумно нравится эта реализация. Особенно меня восторгает то, что Oracle corp не пришлось рихтовать семантику их SQL, чтобы вписать в него XML. Все описанные особенности — объекты, конвейерные функции, табличные выражения используются этой технологией, но не созданы специально для нее. Получается, подобную реализацию мог бы воплотить кто угодно. Эта реализация жирной линией подчеркивает мощь и гибкость ораклиного SQL движка.
На этой ноте я мог бы и закончить, однако мне покоя не дает предвосхищаемый мною вопрос, да с упреком. «Дружище, ты в каком веке вообще живешь, ты на календарь давно заглядывал? На дворе близится к концу 2011й год, уже далеко не первый продакшн поднят на 11r2 версии датабазы, а ты все жуешь девятошный функционал». Да, есть такой грешок за мной. Я прекрасно знаю, что в 10й версии ввели чудный XMLTable, полностью задвигающий на задний план только что описанный мною функционал. Позволяющий еще легче и еще более не принужденно разбирать XML. Однако по XMLTable у меня еще не достаточно опыта, чтобы сказать что либо сверх и без того очевидного. Потому ограничусь лишь простой демонстрацией.
Покажу на том же примере:
Казалось бы, букв стало много больше, может возникнуть справедливый вопрос… а в чем же профит инновации? Профит в том, что первым параметром в XMLTable передается уже не XPath выражение, а XQuery. А значит, объединение может быть произведено именно его средствами, а не средствами SQL. XMLTable обещает быть еще той вкуснятиной, но, увы, повторюсь, мне о нем пока нечего рассказать.
Владимир Пржиялковский , преподаватель технологий Oracle
Введение
Тип XMLTYPE появился в Oracle в версии 9.0. До этого наиболее подходящим для хранения документов в формате XML был тип CLOB (и менее подходящим – тип VARCHAR2, ограниченный максимумом 4000 знаков). Сам по себе объектный, новый тип XMLTYPE технически может храниться либо по-прежнему в виде CLOB, либо в виде объекта (начиная с версии 9.2). И еще одно замечание: несмотря на то, что технологии XML и Java идут «рука об руку», рамки приводимых ниже примеров не требуют от вашей БД установленных возможностей Java.
В этой заметке рассмотрены только логические стороны использования XML в Oracle безотносительно к техническим свойствам хранения и доступа.
Простой пример
CREATE TABLE books
(id NUMBER PRIMARY KEY
, description XMLTYPE);
SELECT id, description FROM books;
SELECT id, b.description.XMLDATA FROM books b;
XMLDATA – специально созданный для XMLTYPE «псевдостолбец».
XMLTYPE – тип XML
XMLTYPE дает возможность сообщить БД, что заносимый текст – это не просто строка, а строка документа XML. Следующая попытка приведет к ошибке:
INSERT INTO books VALUES (101, XMLTYPE(' '));
С дугой стороны, Oracle поймет правильно составленные директивы XML и встроенное в текст описание DTD:
Убедитесь в этом сами, что Oracle действительно соотносит описание DTD самому тексту документа !
Для выборки можно использовать специально придуманные для XMLTYPE функции. Так, функция EXTRACTVALUE извлекает значения элемента из документа XML:
SELECT id, EXTRACTVALUE(description, '/cover/title')
FROM books;
Функция EXISTSNODE дает возможность использовать в SQL условие отбора XPath (язык отбора, принятый в технологиях XML):
SELECT id, b.description.XMLDATA
FROM books b
WHERE b.description.EXISTSNODE('/cover[author="Sanjay Mishra"]')=1;
XMLTYPE – объектный тип Oracle
Доказательством утверждения в заголовке служит создание следующей таблицы объектов типа XMLTYPE, «таблицы документов XML»:
CREATE TABLE xbooks OF XMLTYPE;
Работать с ними можно, как и с XML-атрибутом в обычной таблице:
В первом случае объект 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.
Взаимные преобразования табличного вида и XMLTYPE
Связь двух форм описания данных – табличной и XML – достигается не одною только возможностью создавать в таблицах столбец типа XMLTYPE. Возможно преобразование данных из одного вида в другой, благодаря чему исходный формат хранения данных может оказаться не столь существенен.
Преобразование из XMLTYPE в табличную форму
Для преобразования данных типа XMLTYPE в обычный табличный вид можно использовать функции SQL и методы XMLTYPE, в первую очередь упоминавшуюся метод-функцию EXTRACT:
COLUMN xdoc FORMAT A80
SELECT ROWNUM, id, b.description.EXTRACT('/cover/author') xdoc
FROM books b;
Обратите внимание на возможность и способ обработки нескольких авторов в XML элементах .
Использование функции SQL EXTRACTVALUE, в свою очередь, оставляет возможность отбора не более одного элемента XML для формирования каждой строки результата SELECT, но зато безболезнено убирает обрамляющие значение элемента XML метки:
SELECT id, EXTRACTVALUE(b.description.EXTRACT('/cover/title'), '/title') xdoc
FROM books b;
То же самое можно записать проще, что уже демонстрировалось в начале статьи.
Преобразование из табличной формы в 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;
Следующий пример – агрегирующей функции XMLAGG, допускающей использование в запросах с группировкой GROUP BY, подобно тому, как агрегирующие функции MIN, AVG и другие применяются для обычных данных, а не XMLTYPE:
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, например
Однако в случае выводимой таблицы Oracle смотрит на это сквозь пальцы, а в случае базовой – нет. Возможно это есть следствие определенной недоработанности некоторых областей технологий XML в Oracle, что вызвано чересчур быстрыми темпами развития этих технологий.
XMLType is a system-defined opaque type for handling XML data. It as predefined member functions on it to extract XML nodes and fragments.
You can create columns of XMLType and insert XML documents into it. You can also generate XML documents as XMLType instances dynamically using the SYS_XMLAGG SQL function.
This chapter contains the following topics:
296.1 Summary of XMLType Subprograms
This table summarizes functions and procedures of XMLType .
Table 296-1 XMLTYPE Subprograms
Creates a non schema based XML from the input schema based instance.
Creates a schema based XMLType instance from the non-schema based instance using the input schema URL.
Static function for creating and returning an XMLType instance.
Takes a XMLType instance and a XPath and returns 1 or 0 indicating if applying the XPath returns a non-empty set of nodes.
Takes a XMLType instance and an XPath , applies the XPath expression and returns the results as an XMLType .
Returns the value of the XMLType instance as a BLOB
Returns the value of the XMLType instance as a CLOB .
Returns the namespace for the top level element in a schema based document.
Returns the value of the XMLType instance as a NUMBER . This is only valid if the input XMLType instance contains a simple text node and is convertible to a number.
Returns the root element of the input instance. Returns NULL if the instance is a fragment
Returns the XML schema URL if the input is an XML Schema based.
Returns the value of the XMLType instance as a string.
Checks if the input XMLType instance is a fragment or not. A fragment is a XML instance, which has more than one root element.
Returns 1 or 0 indicating if the input XMLType instance is a schema based one or not.
Checks if the input instance is schema valid according to the given schema URL.
Checks if the instance has been validated against the schema.
Validates the input instance according to the XML Schema. Raises error if the input instance is non-schema based.
Sets the schema valid flag to avoid costly schema validation.
Converts the XMLType instance to an object type.
Takes an XMLType instance and an associated stylesheet (which is also an XMLType instance), applies the stylesheet and returns the result as XML.
Constructs an instance of the XMLType datatype. The constructor can take in the XML as a CLOB , VARCHAR2 or take in a object type.
296.1.1 CREATENONSCHEMABASEDXML
This member function creates a non-schema based XML document from a schema based instance.
296.1.2 CREATESCHEMABASEDXML
This member function creates a schema based XMLType instance from a non-schema based XMLType value.
It uses either the supplied SCHEMA URL, or the SCHEMALOCATION attribute of the instance.
Table 296-2 CREATESCHEMABASEDXML Subprogram Parameters
Optional XMLSchema URL used to convert the value to the specified schema.
296.1.3 CREATEXML
This static function creates and returns an XMLType instance. The string and CLOB parameters used to pass in the date must contain well-formed and valid XML documents.
The options are described in the following table.
Table 296-3 CREATEXML Subprograms
STATIC FUNCTION createXML(
xmlData IN varchar2)
RETURN XMLType deterministic;
Creates the XMLType instance from a string.
STATIC FUNCTION createXML(
xmlData IN clob)
RETURN XMLType deterministic;
Creates the XMLType instance from a CLOB .
STATIC FUNCTION createXML (
xmlData IN clob,
schema IN varchar2,
validated IN number := 0,
wellformed IN number := 0 )
RETURN XMLType deterministic;
This static function creates a schema-based XMLType instance using the specified schema and xml data parameters.
STATIC FUNCTION createXML (
xmlData IN varchar2,
schema IN varchar2,
validated IN number := 0,
wellformed IN number := 0)
RETURN XMLType deterministic;
This static function creates a schema-based XMLType instance using the specified schema and xml data parameters.
STATIC FUNCTION createXML (
schema IN varchar2 := NULL,
element IN varchar2 := NULL,
validated IN NUMBER := 0)
RETURN XMLType deterministic;
Creates an XML instance from an instance of an user-defined type.
STATIC FUNCTION createXML (
xmlData IN SYS_REFCURSOR,
schema in varchar2 := NULL,
element in varchar2 := NULL,
validated in number := 0)
RETURN XMLType deterministic;
Creates an XML instance from a cursor reference. You can pass in any arbitrary SQL query as a CURSOR .
STATIC FUNCTION createXML (
xmlData IN AnyData,
schema in varchar2 := NULL,
element in varchar2 := NULL,
validated in number := 0)
RETURN sys.XMLType deterministic
Creates an XML instance from ANYDATA .If the ANYDATA instance contains an ADT, the XMLType returned is the same as would be returned for a call directly on the ADT. If the ANYDATA contains a scalar, the XMLType contains a leaf node with the scalar value. The element name for this node is taken from the optional element string if present, and is " ANYDATA " if it is not.
STATIC FUNCTION createXML (
xmlData IN blob,
schema IN varchar2,
validated IN number := 0,
wellformed IN number := 0)
return sys.XMLType deterministic
Creates an XML instance from a BLOB .
STATIC FUNCTION createXML (
xmlData IN bfile,
Schema IN varchar2,
validated IN number := 0,
wellformed IN number := 0)
return sys.XMLType deterministic
Creates an XML instance from a BFILE .
Table 296-4 CREATEXML Parameters
The actual data in the form of a BFILE , BLOB , CLOB , REF cursor, VARCHAR2 or object type.
Optional Schema URL to be used to make the input conform to the given schema. Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
Flag to indicate that the instance is valid according to the given XML Schema. (Default is 0 )
Flag to indicate that the input is well formed. If set, then the database would not do well formed check on the input instance. (Default is 0 )
Optional element name in the case of the ADT_1 or REF CURSOR constructors. (Default is NULL ). Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
The character set id of input XML data.
296.1.4 EXISTSNODE
This member function checks if the node exists.
If the XPath string is NULL or the document is empty, then a value of 0 is returned, otherwise returns 1.
The options are described in the following table.
MEMBER FUNCTION existsNode(
xpath IN varchar2)
RETURN number deterministic;
Given an XPath expression, checks if the XPath applied over the document can return any valid nodes.
MEMBER FUNCTION existsNode(
xpath in varchar2,
nsmap in varchar2)
RETURN number deterministic;
This member function uses the XPath expression with the namespace information and checks if applying the XPath returns any nodes or not.
Table 296-5 EXISTSNODE Subprogram Parameters
The XPath expression to test.
Optional namespace mapping.
296.1.5 EXTRACT
This member function extracts an XMLType fragment and returns an XMLType instance containing the result nodes. If the XPath does not result in any nodes, it then returns NULL .
The options are described in the following table.
MEMBER FUNCTION extract(
xpath IN varchar2)
RETURN XMLType deterministic;
Given an XPath expression, applies the XPath to the document and returns the fragment as an XMLType .
MEMBER FUNCTION extract(
xpath IN varchar2,
nsmap IN varchar2)
RETURN XMLType deterministic;
This member function applies the XPath expression and namespace mapping, over the XML data to return a XMLType instance containing the resultant fragment.
Table 296-6 EXTRACT Subprogram Parameters
The XPath expression to apply.
Optional prefix to namespace mapping information.
296.1.6 GETBLOBVAL
This member function returns a BLOB containing the serialized XML representation. If the BLOB returned is temporary, it must be freed after use.
Table 296-7 GETBLOBVAL Subprogram Parameters
The desired character set ID of output BLOB
296.1.7 GETCLOBVAL
This member function returns a CLOB containing the serialized XML representation. If the CLOB returned is temporary, it must be freed after use.
296.1.8 GETNAMESPACE
GETNAMESPACE is a member function. It returns the namespace of the top level element in the instance. It returns NULL if the input is a fragment or is a non-schema based instance.
296.1.9 GETNUMBERVAL
This is a member function. It returns a numeric value, formatted from the text value pointed to by the XMLType instance. The XMLType must point to a valid text node that contains a numerical value.
The options are described in the following table.
296.1.10 GETROOTELEMENT
this member function gets the root element of the XMLType instance. It returns NULL if the instance is a fragment.
296.1.11 GETSCHEMAURL
This member function returns the XML Schema URL corresponding to the XMLType instance, if the XMLType instance is a schema-based document. Otherwise, it returns NULL .
296.1.12 GETSTRINGVAL
This member function returns the document as a string. It returns a string containing the seralized XML representation, or in the case of text nodes, the text itself.
If the XML document exceeds the VARCHAR2 maximum size (4000), then an error is raised at run time.
296.1.13 ISFRAGMENT
ISFRAGMENT determines if the XMLType instance corresponds to a well-formed document, or a fragment. It returns 1 or 0 indicating if the XMLType instance contains a fragment or a well-formed document.
296.1.14 ISSCHEMABASED
This member function determines whether the XMLType instance is schema-based or not. It returns 1 or 0 depending on whether the XMLType instance is schema-based.
296.1.15 ISSCHEMAVALID
This member function checks if the input instance conforms to a specified schema. I does not change the validation status of the XML instance.
If an XML Schema URL is not specified and the xml document is schema based, the conformance is checked against the XMLType instance's own schema.
Table 296-8 ISSCHEMAVALID Subprogram Parameters
The URL of the XML Schema against which to check conformance.
Element of a specified schema, against which to validate. This is useful when we have a XML Schema which defines more than one top level element, and we want to check conformance against a specific one of these elements.
296.1.16 ISSCHEMAVALIDATED
This member function returns the validation status of the XMLType instance to tell if a schema-based instance has been actually validated against its schema. It returns 1 if the instance has been validated against the schema, 0 otherwise.
296.1.17 SCHEMAVALIDATE
This member procedure validates the XML instance against its schema, if it has not already been done.
For non-schema based documents an error is raised. If validation fails an error is raised; else, the document's status is changed to validated.
Table 296-9 SCHEMAVALIDATE Subprogram Parameters
XML instance being validated against the schema.
296.1.18 SETSCHEMAVALIDATED
This member function sets the VALIDATION state of the input XML instance.
Table 296-10 SERTSSCHEMAVALIDATED Subprogram Parameters
0 - NOT VALIDATED ; 1 - VALIDATED (Default)
296.1.19 TOOBJECT
This member procedure converts the XML value to an object type using the XMLSCHEMA mapping, if available. If a SCHEMA is not supplied or the input is a non-schema based XML, the procedure uses cannonical mapping between elements and object type attributes.
Table 296-11 TOOBJECT Subprogram Parameters
Instance to be converted. Implicit if used as a member procedure.
Converted object. An object instance of the required type may be passed in to this function
Schema URL. The mapping of the XMLType instance to the converted object instance may be specified using a schema. Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
Top-level element name. An XML Schema document does not specify the top-level element for a conforming XML instance document without this parameter. Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
296.1.20 TRANSFORM
This member function transforms the XML data using the XSL stylesheet argument and the top-level parameters passed as a string of name=value pairs
If any of the arguments other than the parammap is NULL , then a NULL is returned.
Table 296-12 TRANSFORM Subprogram Parameters
The XSL stylesheet describing the transformation
Top level parameters to the XSL - string of name=value pairs
296.1.21 XMLTYPE
This is an XMLType constructor.
The options are described in the following table.
Table 296-13 XMLTYPE Member Subprogram Parameters
constructor function XMLType(
xmlData IN clob,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN Number := 0)
return self as result deterministic;
This constructor function creates an optionally schema-based XMLType instance using the specified schema and xml data parameters.
constructor function XMLType(
xmlData IN varchar2,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN number := 0)
return self as result deterministic;
This constructor function creates an optionally schema-based XMLType instance using the specified schema and xml data parameters.
constructor function XMLType (
schema IN varchar2 := NULL,
element IN varchar2 := NULL,
validated IN number := 0)
return self as result deterministic;
This constructor function creates an optionally schema-based XMLType instance from the specified object type parameter.
constructor function XMLType(
xmlData IN SYS_REFCURSOR,
schema in varchar2 := NULL,
element in varchar2 := NULL,
validated in number := 0)
return self as result deterministic;
This constructor function creates an optionally schema-based XMLType instance from the specified REF CURSOR parameter.
constructor function XMLType(
xmlData IN AnyData,
schema IN varchar2 := NULL,
element IN varchar2 := NULL,
validated IN number := 0)
return self as result deterministic
This constructor function creates an optionally schema-based XMLType instance from the specified ANYDATA parameter.If the ANYDATA instance contains an ADT, the XMLType returned is the same as would be returned for a call directly on the ADT. If the ANYDATA contains a scalar, the XMLType contains a leaf node with the scalar value. The element name for this node is taken from the optional element string if present, and is " ANYDATA " if it is not.
constructor function XMLType(
xmlData IN blob, csid IN number,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN number := 0)
return self as result deterministic
This constructor function creates an optionally schema-based XMLType instance from the specified BLOB parameter.
constructor function XMLType(
xmlData IN bfile,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN number := 0)
return self as result deterministic
This constructor function creates an optionally schema-based XMLType instance from the specified BFILE parameter.
Table 296-14 XMLTYPE Constructor Subprogram Parameters
The data in the form of a BFILE , BLOB , CLOB , REF s, VARCHAR2 or object type.
Optional Schema URL to be used to make the input conform to the given schema. Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
Indicates that the instance is valid to the given XML Schema.
Indicates that the input is well formed. If set, then the database would not do well formed check on the input instance.
Optional element name in the case of the ADT_1 or REF CURSOR constructors. (Default is NULL ). Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
В Oracle9i был введен ряд предопределенных объектных типов:
- XMLType — хранение и обработка данных в XML-формате;
- типы URI — хранение унифицированных идентификаторов ресурсов (в частности, HTML-адресов);
- типы Any — определение переменных PL/SQL, в которых могут храниться данные любых типов.
Репозиторий Oracle XML DB
Обрабатывать XML-документы в Oracle XML DB лучше всего, сначала загрузив их в специальное хранилище, называемое репозиторием Oracle XML DB. Этот репозиторий имеет иерархическую структуру, как и большинство XML-данных, и позволяет легко запрашивать XML-данные. Для представления отношений между XML-данными в нем используются пути и URL-адреса, а для прохода по содержащимся внутри него папкам и путей — специальный иерархический индекс. В нем могут храниться и данные, отличные от XML, наподобие изображений JPEG, документов Word и многое другое.
Типы данных URI
Семейство типов URI представлено одним основным типом данных и несколькими подтипами, обеспечивающими поддержку хранения URI в переменных PL/SQL и столбцах баз данных. Основной тип для работы с URI называется UriType ; в переменной этого типа может храниться экземпляр любого из следующих подтипов:
Также Oracle предоставляет пакет UriFactory , автоматически генерирующий правильный тип для переданного URI.
Типы URI создаются сценарием $ORACLE_HOME/rdbms/admin/dbmsuri.sql . Владельцем всех типов и подтипов является пользователь SYS . Начиная с Oracle11g, включение сетевого доступа требует создания и настройки списков ACL ( Access Control List ). Это усовершенствование из области безопасности требует выполнения ряда предварительных условий до выхода в Интернет: вы должны создать сетевой список ACL , предоставить ему необходимые привилегии, а затем определить те адреса, к которым разрешает доступ список ACL .
В результате выполнения выводится следующий текст:
За дополнительной информацией о типах семейства UriType обращайтесь к главе 20 документации Oracle XML DB Developer’s Guide.
Создание реляционного представления из XML-документа
Даже если разработчик плохо разбирается в XML, он все равно может использовать XML-документы, хранящиеся в базе данных Oracle, за счет создания на их основе реляционных представлений. Ниже приведен пример отображения узлов в XML-документе на столбцы в реляционном представлении по имени salesorder_view:
Далее к этому представлению salesorder_view можно выполнять запросы точно так же, как и к любому другому представлению в базе данных Oracle, как показано ниже:
Настройка схемы XML
Прежде чем приступить к использованию Oracle XML DB для работы с XML-документами, понадобится выполнить следующие задачи.
Типы данных Any
PL/SQL относится к числу языков со статической типизацией. Как правило, типы данных объявляются и проверяются во время компиляции. Иногда бывает не обойтись без средств динамической типизации; для таких случаев в Oracle9i Release 1 были введены типы Any . Они позволяют выполнять операции над данными, тип которых неизвестен до выполнения программы. При этом поддерживается механизм интроспекции, позволяющий определить тип значения во время выполнения и обратиться к этому значению.
Механизм интроспекции может использоваться в программах для анализа и получения информации о переменных, объявленных в программе. По сути, программа получает информацию о самой себе — отсюда и термин «интроспекция».
Типы Any непрозрачны, то есть вы не можете манипулировать с внутренними структурами напрямую, а должны использовать программные средства.
К семейству Any относятся следующие типы данных:
- AnyData — может содержать одиночное значение любого типа: скалярную величину, пользовательский объект, вложенную таблицу, массив VARRAY и т. д.
- AnyDataSet — может содержать набор значений, относящихся к одному типу.
- AnyType — описание типа, своего рода «тип без данных».
Типы Any включаются в исходную поставку базы данных или создаются сценарием dbmsany.sql, хранящимся в каталоге $ORACLE_HOME/rdbms/admin. Их владельцем является пользователь SYS .
Кроме типов Any , сценарий dbmsany.sql создает пакет DBMS_TYPES с определениями именованных констант (таких, как TYPECODE_DATE ). Они могут использоваться совместно с анализирующими функциями, и в частности с GETTYPE , для определения типа данных, хранящихся в конкретной переменной AnyData или AnyDataSet . Конкретные числовые значения этих констант для нас несущественны — ведь константы для того и определены, чтобы программисты пользовались именами, а не значениями.
В следующем примере создаются два пользовательских типа, представляющих два географических объекта: водопады и реки. Далее блок кода PL/SQL с помощью функции SYS.AnyType определяет массив разнородных объектов (элементы которого могут относиться к разным типам данным).
Сначала создаются два объектных типа:
Затем выполняется следующий блок PL/SQL:
Результат выполнения кода будет таким:
Давайте разберемся, как работает этот код. Необходимые для его работы объекты хранятся в массиве VARRAY , который инициализируется следующим образом:
Рассмотрим в общих чертах структуру этого кода:
- waterfall('Grand Sable Falls',30)
Вызов конструктора типа waterfall для создания объекта типа waterfall . - AnyData.ConvertObject(
Преобразование объекта waterfall в экземпляр SYS.AnyData , который после этого можно будет записать в массив объектов SYS.AnyData. - feature_array (
Вызов конструктора массива. Каждый аргумент этой функции имеет тип AnyData .
В данном случае массив состоит из двух передаваемых аргументов.
Напомню, что про массивы VARRAY можно почитать в этом блоге.
Следующий важный фрагмент кода — цикл FOR , в котором последовательно анализируются объекты массива features . Вызов features(x).GetTypeName возвращает полное имя текущего объекта. Для пользовательских объектов перед именем типа ставится имя схемы пользователя, создавшего объект. Это имя схемы включается в условие WHEN :
Если вы захотите выполнить этот пример в своей системе, не забудьте заменить используемую схему ( PLUSER ) именем своей схемы. При создании типов, которые должны использоваться при интроспекции, тщательно продумайте проблему владельца типа — возможно, вам придется статически включить его в код.
При использовании встроенных типов данных, таких как NUMBER, DATE и VARCHAR2 , функция GetTypeName возвращает просто имя типа. Имя схемы указывается только для типов, определяемых пользователем (то есть созданных конструкцией CREATE TYPE ).
Определив тип данных, мы извлекаем объект из массива:
В данном примере возвращаемое функцией значение игнорируется. В общем случае результатом работы функции может быть одно из двух значений:
- DBMS_TYPES.SUCCESS — значение, свидетельствующее о том, что переменная типа Any содержит данные определенного типа (в нашем случае объект).
- DBMS_TYPES.NO_DATA — значение, указывающее, что в переменной типа AnyData не оказалось никаких данных.
Когда переменной будет присвоен экземпляр объекта, мы можем относительно легко написать оператор DBMS_OUTPUT для объекта данного типа. Например, информация о водопаде выводится так:
Также желательно ознакомиться с документами Oracle PL/SQL Packages and Types Reference и Object-Relational Developer’s Guide .
С точки зрения объектно-ориентированного программирования существуют более эффективные способы работы с объектными типами данных. Однако на практике не всегда стоит тратить время на достижение идеала, и рассмотренный пример достаточно хорошо демонстрирует возможности предопределенного объектного типа SYS.AnyData.
В любой типичной организации информация хранится в нескольких форматах, часть которой, возможно, помещается в реляционные базы данных, но большая часть все-таки хранится за пределами этих баз данных. Не помещаемая в базы данных информация может храниться в формате конкретных приложений, например, электронных таблиц Excel. Сохранение ее вместо этого в формате XML позволяет упрощать процесс получения доступа и обновления неструктурированных данных организации.
Oracle XML DB (XML-база данных Oracle) не является базой данных специально предназначенного для XML-данных типа. Она просто дополнительно содержит набор встроенных технологий для хранения, извлечения и манипулирования XML-данными. Она обладает преимуществами одновременно и технологии реляционных баз данных, и технологии XML. Например, одна из главных проблем при работе с XML-данными в реляционной базе данных состоит в том, что большинство XML-данных имеют иерархическую структуру по своей природе, в то время как база данных Oracle основана на реляционной модели. Через Oracle XML DB предоставляется возможность эффективной обработки иерархических XML-данных за счет применения специальных SQL-операторов и методов, которые позволяют запрашивать и обновлять XML-данные в базе Oracle. Посредством Oracle XML DB в ядро Oracle встраивается объектная модель документов XML ( Document Object Model — DOM). Благодаря этому, большинство операций с данными XML воспринимается как часть обычного процесса обработки данных.
Oracle XML DB предоставляет возможность просматривать как структурированную, так и неструктурированную информацию в формате реляционных данных. То есть данные можно просматривать как в виде строк в таблице, так и в виде узлов в XML-документе.
Ниже приведен краткий перечень предлагаемых XML-базой данных Oracle преимуществ:
- К XML-данным можно получать доступ с помощью обычных SQL-запросов.
- Для обработки XML-данных можно использовать поддерживаемые Oracle технологии оперативной обработки транзакций (OLTP), создания хранилищ данных, тестирования, пространственных данных и мультимедиа.
- Можно генерировать XML из SQL-запросов Oracle.
- Можно легко преобразовывать XML в формат HTML.
Тип XMLType
В Oracle9i появился встроенный объектный тип XMLType для определения столбцов и переменных PL/SQL, содержащих документы XML . Методы XMLType позволяют создавать экземпляры новых значений XMLType , извлекать фрагменты документов XML и выполнять другие операции с содержимым документов XML .
Язык XML — обширная тема, которую невозможно подробно изложить в книге. Тем не менее при работе с XML из PL/SQL необходимо знать как минимум две вещи:
- XMLType — встроенный объектный тип, который позволяет хранить документы XML в столбце базы данных или в переменной PL/SQL. Тип XMLType был введен в Oracle9i Release 1.
- XQuery — язык запросов для выборки и построения документов XML . Поддержка XQuery появилась в Oracle10g Release 2.
Кроме этих двух технологий, в работе с XML также используются технологии XPath для построения ссылок на части документа, XML Schema для описания структуры документа и т. д. Тип XMLType позволяет легко создать таблицу для хранения данных XML :
В этой таблице для XML-данных определен столбец fall с типом XMLType . Чтобы записать в него информацию, необходимо вызвать статический метод CreateXML и передать ему данные в формате XML . Полученный объект возвращается как результат метода и помещается в столбец базы данных. Перегруженные версии метода CreateXML могут получать как данные VARCHAR2 , так и данные CLOB .
Следующие инструкции INSERT создают три документа XML и помещают их в таблицу
Для выборки XML-данных из таблицы используются методы объекта XMLType . Метод existsNode , вызываемый в следующем примере, проверяет существование в XML- документе заданного узла. Аналогичную проверку выполняет встроенная функция SQL EXISTSNODE . Она, как и указанный метод, идентифицирует узел с помощью выражения XPath1 .
Следующие инструкции возвращают одинаковые результаты:
Конечно, с XML-данными можно работать и в PL/SQL. В следующем примере переменной PL/SQL типа XMLType присваивается значение из столбца fall первой добавленной нами строки таблицы. Затем я считываю в программе PL/SQL весь XML-документ с которым после этого можно работать, как с любой другой информацией. В данном случае после выборки документа мы извлекаем и выводим текст из узла /fall/url .
Обратите внимание на следующие строки:
- SELECT f.fall INTO demo_block.fall — имя переменной fall совпадает с именем столбца таблицы, поэтому в запросе SQL имя переменной уточняется именем блока PL/SQL.
- url := fall.extract('/fall/url/text()').getStringVal; — для получения текста URL вызываются два метода объекта XMLType :
- extract — возвращает объект XMLType , содержащий заданный фрагмент исходного XML-документа (для определения требуемого фрагмента используется выражение XPath );
- getStringVal — возвращает текст XML-документа.
В рассмотренном примере метод getStringVal вызывается для XML-документа, возвращаемого методом extract . Метод extract возвращает содержимое узла < url >в виде объекта XMLType , а метод getStringVal извлекает из него содержимое в виде текстовой строки.
Столбцы XMLType даже можно индексировать для повышения эффективности выборки XML-документов. Для создания индекса необходимо обладать привилегиями QUERY REWRITE . В следующем примере индекс строится по первым 80 символам имени водопада из таблицы falls :
Обратите внимание на использование функции SUBSTR . Метод getStringVal возвращает строку, слишком длинную для индексирования, в результате чего происходит ошибка. Функция же SUBSTR уменьшает длину полученной строки до приемлемого размера.
Если вы решите задействовать объект XMLType в своих приложениях, за более полной и актуальной информацией обращайтесь к документации Oracle. XML DB Developer’s Guide содержит важную, если не сказать — абсолютно необходимую информацию для разработчиков, работающих с XML. В SQL Reference также представлена полезная информация о XMLType и встроенных функциях SQL, поддерживающих работу с XML. В справочнике Oracle PL/SQL Packages and Types Reference описаны программы, методы и исключения всех предопределенных объектных типов, а также нескольких пакетов для работы с данными XML, включая DBMS_XDB, DBMS_XMLSCHEMA и DBMS_XMLDOM .
296.1 Summary of XMLType Subprograms
This table summarizes functions and procedures of XMLType .
Table 296-1 XMLTYPE Subprograms
Creates a non schema based XML from the input schema based instance.
Creates a schema based XMLType instance from the non-schema based instance using the input schema URL.
Static function for creating and returning an XMLType instance.
Takes a XMLType instance and a XPath and returns 1 or 0 indicating if applying the XPath returns a non-empty set of nodes.
Takes a XMLType instance and an XPath , applies the XPath expression and returns the results as an XMLType .
Returns the value of the XMLType instance as a BLOB
Returns the value of the XMLType instance as a CLOB .
Returns the namespace for the top level element in a schema based document.
Returns the value of the XMLType instance as a NUMBER . This is only valid if the input XMLType instance contains a simple text node and is convertible to a number.
Returns the root element of the input instance. Returns NULL if the instance is a fragment
Returns the XML schema URL if the input is an XML Schema based.
Returns the value of the XMLType instance as a string.
Checks if the input XMLType instance is a fragment or not. A fragment is a XML instance, which has more than one root element.
Returns 1 or 0 indicating if the input XMLType instance is a schema based one or not.
Checks if the input instance is schema valid according to the given schema URL.
Checks if the instance has been validated against the schema.
Validates the input instance according to the XML Schema. Raises error if the input instance is non-schema based.
Sets the schema valid flag to avoid costly schema validation.
Converts the XMLType instance to an object type.
Takes an XMLType instance and an associated stylesheet (which is also an XMLType instance), applies the stylesheet and returns the result as XML.
Constructs an instance of the XMLType datatype. The constructor can take in the XML as a CLOB , VARCHAR2 or take in a object type.
296.1.1 CREATENONSCHEMABASEDXML
This member function creates a non-schema based XML document from a schema based instance.
296.1.2 CREATESCHEMABASEDXML
This member function creates a schema based XMLType instance from a non-schema based XMLType value.
It uses either the supplied SCHEMA URL, or the SCHEMALOCATION attribute of the instance.
Table 296-2 CREATESCHEMABASEDXML Subprogram Parameters
Optional XMLSchema URL used to convert the value to the specified schema.
296.1.3 CREATEXML
This static function creates and returns an XMLType instance. The string and CLOB parameters used to pass in the date must contain well-formed and valid XML documents.
The options are described in the following table.
Table 296-3 CREATEXML Subprograms
STATIC FUNCTION createXML(
xmlData IN varchar2)
RETURN XMLType deterministic;
Creates the XMLType instance from a string.
STATIC FUNCTION createXML(
xmlData IN clob)
RETURN XMLType deterministic;
Creates the XMLType instance from a CLOB .
STATIC FUNCTION createXML (
xmlData IN clob,
schema IN varchar2,
validated IN number := 0,
wellformed IN number := 0 )
RETURN XMLType deterministic;
This static function creates a schema-based XMLType instance using the specified schema and xml data parameters.
STATIC FUNCTION createXML (
xmlData IN varchar2,
schema IN varchar2,
validated IN number := 0,
wellformed IN number := 0)
RETURN XMLType deterministic;
This static function creates a schema-based XMLType instance using the specified schema and xml data parameters.
STATIC FUNCTION createXML (
schema IN varchar2 := NULL,
element IN varchar2 := NULL,
validated IN NUMBER := 0)
RETURN XMLType deterministic;
Creates an XML instance from an instance of an user-defined type.
STATIC FUNCTION createXML (
xmlData IN SYS_REFCURSOR,
schema in varchar2 := NULL,
element in varchar2 := NULL,
validated in number := 0)
RETURN XMLType deterministic;
Creates an XML instance from a cursor reference. You can pass in any arbitrary SQL query as a CURSOR .
STATIC FUNCTION createXML (
xmlData IN AnyData,
schema in varchar2 := NULL,
element in varchar2 := NULL,
validated in number := 0)
RETURN sys.XMLType deterministic
Creates an XML instance from ANYDATA .If the ANYDATA instance contains an ADT, the XMLType returned is the same as would be returned for a call directly on the ADT. If the ANYDATA contains a scalar, the XMLType contains a leaf node with the scalar value. The element name for this node is taken from the optional element string if present, and is " ANYDATA " if it is not.
STATIC FUNCTION createXML (
xmlData IN blob,
schema IN varchar2,
validated IN number := 0,
wellformed IN number := 0)
return sys.XMLType deterministic
Creates an XML instance from a BLOB .
STATIC FUNCTION createXML (
xmlData IN bfile,
Schema IN varchar2,
validated IN number := 0,
wellformed IN number := 0)
return sys.XMLType deterministic
Creates an XML instance from a BFILE .
Table 296-4 CREATEXML Parameters
The actual data in the form of a BFILE , BLOB , CLOB , REF cursor, VARCHAR2 or object type.
Optional Schema URL to be used to make the input conform to the given schema. Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
Flag to indicate that the instance is valid according to the given XML Schema. (Default is 0 )
Flag to indicate that the input is well formed. If set, then the database would not do well formed check on the input instance. (Default is 0 )
Optional element name in the case of the ADT_1 or REF CURSOR constructors. (Default is NULL ). Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
The character set id of input XML data.
296.1.4 EXISTSNODE
This member function checks if the node exists.
If the XPath string is NULL or the document is empty, then a value of 0 is returned, otherwise returns 1.
The options are described in the following table.
MEMBER FUNCTION existsNode(
xpath IN varchar2)
RETURN number deterministic;
Given an XPath expression, checks if the XPath applied over the document can return any valid nodes.
MEMBER FUNCTION existsNode(
xpath in varchar2,
nsmap in varchar2)
RETURN number deterministic;
This member function uses the XPath expression with the namespace information and checks if applying the XPath returns any nodes or not.
Table 296-5 EXISTSNODE Subprogram Parameters
The XPath expression to test.
Optional namespace mapping.
296.1.5 EXTRACT
This member function extracts an XMLType fragment and returns an XMLType instance containing the result nodes. If the XPath does not result in any nodes, it then returns NULL .
The options are described in the following table.
MEMBER FUNCTION extract(
xpath IN varchar2)
RETURN XMLType deterministic;
Given an XPath expression, applies the XPath to the document and returns the fragment as an XMLType .
MEMBER FUNCTION extract(
xpath IN varchar2,
nsmap IN varchar2)
RETURN XMLType deterministic;
This member function applies the XPath expression and namespace mapping, over the XML data to return a XMLType instance containing the resultant fragment.
Table 296-6 EXTRACT Subprogram Parameters
The XPath expression to apply.
Optional prefix to namespace mapping information.
296.1.6 GETBLOBVAL
This member function returns a BLOB containing the serialized XML representation. If the BLOB returned is temporary, it must be freed after use.
Table 296-7 GETBLOBVAL Subprogram Parameters
The desired character set ID of output BLOB
296.1.7 GETCLOBVAL
This member function returns a CLOB containing the serialized XML representation. If the CLOB returned is temporary, it must be freed after use.
296.1.8 GETNAMESPACE
GETNAMESPACE is a member function. It returns the namespace of the top level element in the instance. It returns NULL if the input is a fragment or is a non-schema based instance.
296.1.9 GETNUMBERVAL
This is a member function. It returns a numeric value, formatted from the text value pointed to by the XMLType instance. The XMLType must point to a valid text node that contains a numerical value.
The options are described in the following table.
296.1.10 GETROOTELEMENT
this member function gets the root element of the XMLType instance. It returns NULL if the instance is a fragment.
296.1.11 GETSCHEMAURL
This member function returns the XML Schema URL corresponding to the XMLType instance, if the XMLType instance is a schema-based document. Otherwise, it returns NULL .
296.1.12 GETSTRINGVAL
This member function returns the document as a string. It returns a string containing the seralized XML representation, or in the case of text nodes, the text itself.
If the XML document exceeds the VARCHAR2 maximum size (4000), then an error is raised at run time.
296.1.13 ISFRAGMENT
ISFRAGMENT determines if the XMLType instance corresponds to a well-formed document, or a fragment. It returns 1 or 0 indicating if the XMLType instance contains a fragment or a well-formed document.
296.1.14 ISSCHEMABASED
This member function determines whether the XMLType instance is schema-based or not. It returns 1 or 0 depending on whether the XMLType instance is schema-based.
296.1.15 ISSCHEMAVALID
This member function checks if the input instance conforms to a specified schema. I does not change the validation status of the XML instance.
If an XML Schema URL is not specified and the xml document is schema based, the conformance is checked against the XMLType instance's own schema.
Table 296-8 ISSCHEMAVALID Subprogram Parameters
The URL of the XML Schema against which to check conformance.
Element of a specified schema, against which to validate. This is useful when we have a XML Schema which defines more than one top level element, and we want to check conformance against a specific one of these elements.
296.1.16 ISSCHEMAVALIDATED
This member function returns the validation status of the XMLType instance to tell if a schema-based instance has been actually validated against its schema. It returns 1 if the instance has been validated against the schema, 0 otherwise.
296.1.17 SCHEMAVALIDATE
This member procedure validates the XML instance against its schema, if it has not already been done.
For non-schema based documents an error is raised. If validation fails an error is raised; else, the document's status is changed to validated.
Table 296-9 SCHEMAVALIDATE Subprogram Parameters
XML instance being validated against the schema.
296.1.18 SETSCHEMAVALIDATED
This member function sets the VALIDATION state of the input XML instance.
Table 296-10 SERTSSCHEMAVALIDATED Subprogram Parameters
0 - NOT VALIDATED ; 1 - VALIDATED (Default)
296.1.19 TOOBJECT
This member procedure converts the XML value to an object type using the XMLSCHEMA mapping, if available. If a SCHEMA is not supplied or the input is a non-schema based XML, the procedure uses cannonical mapping between elements and object type attributes.
Table 296-11 TOOBJECT Subprogram Parameters
Instance to be converted. Implicit if used as a member procedure.
Converted object. An object instance of the required type may be passed in to this function
Schema URL. The mapping of the XMLType instance to the converted object instance may be specified using a schema. Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
Top-level element name. An XML Schema document does not specify the top-level element for a conforming XML instance document without this parameter. Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
296.1.20 TRANSFORM
This member function transforms the XML data using the XSL stylesheet argument and the top-level parameters passed as a string of name=value pairs
If any of the arguments other than the parammap is NULL , then a NULL is returned.
Table 296-12 TRANSFORM Subprogram Parameters
The XSL stylesheet describing the transformation
Top level parameters to the XSL - string of name=value pairs
296.1.21 XMLTYPE
This is an XMLType constructor.
The options are described in the following table.
Table 296-13 XMLTYPE Member Subprogram Parameters
constructor function XMLType(
xmlData IN clob,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN Number := 0)
return self as result deterministic;
This constructor function creates an optionally schema-based XMLType instance using the specified schema and xml data parameters.
constructor function XMLType(
xmlData IN varchar2,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN number := 0)
return self as result deterministic;
This constructor function creates an optionally schema-based XMLType instance using the specified schema and xml data parameters.
constructor function XMLType (
schema IN varchar2 := NULL,
element IN varchar2 := NULL,
validated IN number := 0)
return self as result deterministic;
This constructor function creates an optionally schema-based XMLType instance from the specified object type parameter.
constructor function XMLType(
xmlData IN SYS_REFCURSOR,
schema in varchar2 := NULL,
element in varchar2 := NULL,
validated in number := 0)
return self as result deterministic;
This constructor function creates an optionally schema-based XMLType instance from the specified REF CURSOR parameter.
constructor function XMLType(
xmlData IN AnyData,
schema IN varchar2 := NULL,
element IN varchar2 := NULL,
validated IN number := 0)
return self as result deterministic
This constructor function creates an optionally schema-based XMLType instance from the specified ANYDATA parameter.If the ANYDATA instance contains an ADT, the XMLType returned is the same as would be returned for a call directly on the ADT. If the ANYDATA contains a scalar, the XMLType contains a leaf node with the scalar value. The element name for this node is taken from the optional element string if present, and is " ANYDATA " if it is not.
constructor function XMLType(
xmlData IN blob, csid IN number,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN number := 0)
return self as result deterministic
This constructor function creates an optionally schema-based XMLType instance from the specified BLOB parameter.
constructor function XMLType(
xmlData IN bfile,
schema IN varchar2 := NULL,
validated IN number := 0,
wellformed IN number := 0)
return self as result deterministic
This constructor function creates an optionally schema-based XMLType instance from the specified BFILE parameter.
Table 296-14 XMLTYPE Constructor Subprogram Parameters
The data in the form of a BFILE , BLOB , CLOB , REF s, VARCHAR2 or object type.
Optional Schema URL to be used to make the input conform to the given schema. Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
Indicates that the instance is valid to the given XML Schema.
Indicates that the input is well formed. If set, then the database would not do well formed check on the input instance.
Optional element name in the case of the ADT_1 or REF CURSOR constructors. (Default is NULL ). Caution : Oracle does not support use of types generated by Schema Registration (see Oracle XML DB Developer's Guide ).
В Oracle9i был введен ряд предопределенных объектных типов:
- XMLType — хранение и обработка данных в XML-формате;
- типы URI — хранение унифицированных идентификаторов ресурсов (в частности, HTML-адресов);
- типы Any — определение переменных PL/SQL, в которых могут храниться данные любых типов.
Сохранение XML-данных в Oracle XML DB
Для сохранения и управления XML-данными в реляционной таблице применяется специальный тип данных XMLType. Этот тип, а также тип XDBURIType, который представляет собой еще один встроенный тип, предназначенный для работы с данными XML, позволяет возлагать ответственность за выполнение синтаксического анализа, хранение и извлечение XML-данных на базу данных Oracle. Использовать тип XMLType можно точно так же, как и обычные типы данных в базе данных Oracle. Благодаря ему, правильно оформленный XML-документ теперь можно сохранять в базе данных в виде XML-теста с использованием базового типа данных CLOB.
Ниже приведен пример применения типа данных XMLType:
Тип данных XMLType поставляется с набором специальных XML-методов, которые можно использовать для работы с объектами XMLType. Эти методы можно применять для выполнения как типичных операций в базе данных, наподобие проверки на предмет существования узла или извлечения узла, так и нескольких специальных операций, позволяющих получать доступ к XML-данными и манипулировать ими в виде части обычного SQL-оператора. Эти специальные операции являются отражением развивающегося стандарта SQL/XML. За счет использования уже хорошо известной нотации XPath, они осуществляют обход по структурам XML и отыскивают тот узел или узлы, к которым им следует применить указанные SQL-операторы. Ниже перечислены некоторые наиболее важные операции SQL/XML.
- Extract(). Извлекает подмножество узлов, содержащихся в XMLType.
- ExistsNode(). Проверяет, существует ли конкретный узел в XMLType.
- Validating(). Проверяет правильность содержимого XMLType по схеме XML.
- Transform(). Выполняет XSL-преобразование.
- ExtractValue(). Возвращает узел, соответствующий выражению XPath.
XML-данные имеют абстрактную форму по сравнению с записями в обычных реляционных таблицах. Для оптимизации и выполнения операторов, подразумевающих обработку XML-данных, в Oracle применяется механизм перезаписи запросов, преобразующий выражение XPath в обычный эквивалентный оператор SQL. После этого оптимизатор обрабатывает этот преобразованный SQL-оператор подобно любому другому оператору SQL.
Сохранять XML-данные в XML-базе данных Oracle можно двумя способами.
- С использованием SQL или PL/SQL для вставки данных. Такой подход подразумевает сначала преобразование исходных данных в экземпляр XMLType с помощью конструкторов XMLType.
- С использованием репозитория Oracle XML DB для сохранения XML-данных.
Ниже приведен простой пример, в котором для демонстрации выполнения основанной на SQL операции DML в отношении поддерживающей XML таблицы используется таблица sales_catalog_table. В листинге 2 в эту таблицу вставляется XML-документ.
Теперь для просмотра XML-документа в его исходном формате достаточно просто запросить столбец sales_order таблицы sales_catalog_table, как показано в листинге 3.
После создания из таблицы sales_catalog_table можно очень легко извлекать данные с помощью любого из описанных выше методов. Ниже показан пример применения метода extract(). В этом примере выражения XPath и операции SQL/XML extractValue и existsNode применяются для поиска названия того отправления, у которого в узле SalesOrder/SalesLocation/text() содержится значение Dallas.
Читайте также: