Выбрать главу

) AS xml_customer

FROM dual;

XML_CUSTOMER

<customer>

<customer_id>1</customer_id>

<name>John Brown</name>

</customer>

Примечание На странице http://www.w3.org/TP/REC-xml можно найти более подробную информацию

о хорошо сформированных XML документах и значениях.

XMLPI()

XMLPI() используется для создания инструкции обработки XML. Инструкция

обработки обычно используется для того, чтобы передать приложению

634 Глава 17

информацию, связанную с XML данными. Приложение может в дальнейшем

использовать инструкцию обработки для определения того, как обрабатывать

XML данные.

В следующем примере создается инструкция обработки для статуса заказов.

П SELECT XMLPI(

NAME “order_status” ,

‘ PLACED, PENDING, SHIPPED’

) AS xml_order_status_pi

FROM dual;

XML_ORDER_STATUS_PI

<?order_status PLACED, PENDING, SHIPPED?>

В следующем примере создается инструкция обработки для показа XML

документа с использованием файла по имени example.css, содержащего

каскадную таблицу стилей:

П SELECT XMLPI(

NAME “xml-stylsheet” ,

‘ type=”text/css” href=” example.css"’

) AS xml_stylesheet_pi

FROM dual;

XML_STYLESHEET_PI

<?xml-stylesheet type=”text/css” href=”example.css”?>

XMLCOMMENT()

XMLCOMMENTO создает комментарий XML в виде текстовой строки, заключенной

в <!- и ->. Например:

□ SELECT XMLCOMMENT(

‘ An example XML Comment’

) AS xml_comment

FROM dual;

XML_COMMENT

< !--An example XML Comment-->

XMLSEQUENCE()

XMLSEQUENCE() используется для создания объекта типа XMLSequenceType,

который представляет собой массив переменной длины объектов типа

XMLType. Поскольку XMLSEQUENCE() возвращает массив переменной длины,

то ее можно использовать в выражении FROM запроса. Например:

П SELECT VALUЕ(lis t_o f_va lu e s ).GETSTRINGVAL( ) order_values

FROM TABLE (

XMLSEQUENCE(

XML и база данных Oracle 635

EXTRACT(

XMLType(1 <A><B>PLACED</B><B>PENDING</B><B>SHIPPED</BX/A>’ ),

7A/B/’

)

))

list_of_values;

ORDER_VALUES

<B>PLACED</B>

<B>PENDING</B>

<B>SHIPPED</B>

Давайте подробно разберем этот пример. Вызов к XMLType() представляет

собой

□ XMLType(' <A><B>PLACED</B><B>PENDING</BXB>SHIPPED</В></А>’ )

Этот вызов создает объект, содержащий XML:

□ <A><B>PLACED</BXB>PENDING</B><B>SHIPPED</B></A>

Вызов функции EXTRACT представляет собой:

□ EXTRACT(

Хш1Туре(' <AXB>PLACED</BXB>PENDING</BXB>SHIPPED</BX/A>'),

‘ /А /В / ’

)

EXTRACT ( ) выбирает данные XML из объекта XMLType, возвращаемого

посредством вызова XMLType(). Второй параметр EXTRACT( ) представляет

собой строку XPath. XPath - это язык, предназначенный для доступа к указанным

элементам в данных XML. Например, в предыдущем вызове

EXTRACT ( ) , ’ /А/В ’ возвращает все элементы В, которые являются дочерними

элементами элементов А. Таким образом, функция EXTRACT( ) возвратит

следующее:

□ <B>PLACED</B>

<B>PENDING</B>

<B>SHIPPED</B>

Вызов XMLSEQUENCE() в приведенном примере просто возвращает массив

переменной длины, содержащий элементы, полученные при помощи

EXTRACT(). TABLE() преобразует массив переменной длины в строки таблицы

и применяет псевдоним list_of_VALUES к данной таблице. Оператор

SELECT выбирает значения строк, имеющие тип данных «строка», в эту таблицу

при помощи GETSTRINGVAL().

Позже в этой главе будет рассмотрено больше примеров использования

EXTRACT( ) и XPath.

XMLSERIAUZEO

XMLSERIALIZE() используется для создания из полученного результата выражения

представления данных XML в виде строки или объекта L0B (большого

объекта). Перед выражением необходимо указать один из параметров:

636 Глава 17

■ CONTENT - этот параметр означает, что выражение должно возвращать

корректное значение XML;

■ DOCUMENT - этот параметр означает, что выражение должно возвращать

XML документ с одним корневым узлом.

В следующем npHMepeHcmwib3yeTcaXMLSERIALIZE() с параметром CONTENT

для создания значения XML:

□ SELECT XMLSERIALIZE(

CONTENT XMLType ( ' <order_status>SHIPPED</order_status>’ )

) AS xml_order_status

FROM DUAL;

XML_ORDER_STATUS

<order_status>SHIPPED</order_status>

В следующем примере используется XMLSERIALIZE() с параметром

DOCUMENT для создания документа XML, возвращаемого в виде CL0B (большой

символьный объект):

□ SELECT XMLSERIALIZE(

CONTENT XMLType ( ' <description>Description of a product</description>’ )

) AS xml_product_description

FROM DUAL;

XML_PRODUCT_DESCRIPTION

<description>Description of a product</description>

Пример записи данных XML в файл на PL/SQL

В данном разделе мы рассмотрим законченный пример на PL/SQL для записи

имен покупателей в файл XML. Прежде всего, вам необходимо подключиться

к базе данных с правами привилегированного пользователя