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

create_xml_resources(); эта процедура создает строку XML для товаров и

типов товаров. Она использует методы из пакета PL/SQL DBMS_XDB для

удаления и создания файлов ресурсов в Oracle XML DB Repository (Oracle

XML DB Repository представляет собой область для хранения XML данных

в базе данных):

□ CREATE PROCEDURE create_xml_resou rces AS

v _ re s u lt BOOLEAN;

- - создание строки, содержащей XML для продуктов

v_products VARCHAR2(300):=

'<?xml version=»1. 0»?>' ||

'<products>' ||

'<product product_id=»1» product_type_id=»1» name=»Modern Science»'

|| ' price=»19.95»/>' ||

'<product product_id=»2» product_type_id=»1» name=»Chemistry»' ||

price=»30»/>' ||

'<product product_id=»3» product_type_id=»2» name=»Supernova»' ||

price=»25.99»/>' ||

'< /p ro d u c ts> ';

- - создание строки, содержащей XML для типов продуктов

v_product_types VARCHAR2(300):=

' <?xml version=»1. 0»?>' ||

'<product_types>' ||

'<product_type product_type_id=»1» name=»Book»/>' ||

'<product_type product_type_id=»2» name=»Video»/>’ ||

'< /p ro d u ct_ typ e s> ';

BEGIN

— удаление существующих ресурсов для продуктов

DBMS_XDB.DELETERESOURCE('/public/products.xml',

DBMS_XDB.DELETE_RECURSIVE_FORCE);

— создание ресурса для продуктов

v _ re s u lt := DBMS_XDB.CREATERESOURCE(’ /p u b lic /p ro d u c ts .xm l',

v _ p ro d u c ts );

- - удаление любых существующих ресурсов для типов продуктов

DBMS_XDB.DELETERESOURCE('/public/product_types.xml',

DBMS_XDB.DELETE_RECURSIVE_FORCE);

640 Глава 17

— создание ресурса для типов продуктов

v_result := DBMS_XDB.CREATERESOURCE('/public/product_types.xml',

v_product_types);

END create_xml_resources;

/

Нсколько замечаний для create_xml_resources().

■ Процедура DBMS_XDB. DELETERESOURCE() удаляет XML ресурс из базы

данных. Процедура create_xml_resources() вызывает её, чтобы вам не

потребовалось вручную удалять ресурсы, если create_xml_resou rces()

запускается более одного раза.

■ Константа DBMS_XDB. DELETE_RECURSIVE_FORCE вызывает принудительное

удаление ресурсов, включая дочерние объекты.

■ Функция DBMS_XDB.CREATERESOURCE() создает ресурс в базе данных и

возвращает логическое значение true/false, указывающее, успешно

ли завершилась операция. Два вызова этой функции для товаров и

типов товаров создают ресурсы в каталоге / public, являющемся абсолютным

путем к ресурсам.

Следующее выражение вызывает create_xml_resources():

□ CALL create_xml_resources();

Следующий запрос использует XMLQUERYO для выборки товаров из ресурса

/public/products.xmclass="underline"

П SELECT ХМLQUERY(

‘ for Sproduct in doc('7public/products.xml” )/products/product

return <product name=” {$product/@name}”/>’

RETURNING CONTENT

) AS xml_products

FROM DUAL;

XML PRODUCTS

<product name=”Modern Science”x/product>

<product name=”Chemistry”x/product>

<product name="Supernova”x/product>

Выражение XQuery внутри XMLQUERY() из предыдущего примера выглядит

следующим образом:

□ for Sproduct in doc(«/public/products.xml»)/products/product

return <product name=” {$product/@name}”/>

Рассмотрим более подробно выражение XQuery.

■ Цикл for перебирает товары в / public/products.xml.

■ Переменная $product является переменной связи, которая привязывается

к возвращаемой doc («/public/products.xml»)/products/

product последовательности товаров; doc(«/public/products.xml»)

возвращает документ products.xml, хранящийся в / public. При каждой

итерации цикла переменная $product устанавливается в один из

товаров из файла products.xml, один за другим.

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

■ Часть return приведенного выше выражения возвращает имя товара

в $product.

Следующий запрос выбирает типы товаров из ресурса /public/

product_types.xmclass="underline"

П SELECT XMLQUERY(

‘ for $product_type in

doc(“/public/product_types.xml” )/product_types/product_type

return <product_type name=” {$product_type/@name}”/>’

RETURNING CONTENT

) AS xml_product_types

FROM DUAL;

XML_PRODUCT_TYPES

<product_type name=”Book”x/product_type>

<product_type name=”Video”x/product_type>

Следующий запрос выбирает товары, цена которых больше 20, вместе

с типом товара:

□ SELECT XMLQUERY(

‘ for $рroduct in doc(“/public/products.xml” )/products/product

le t $product_type :=

doc(“/public/product_types.xml” )//product_type[@product_type_id =

$p roduct/@p roduct_type_id]/@name

where $product/@price > 20

order by $product/@product_id

return <product name=” {$product/@name}"

product_type=” {$product_type}”/>’

RETURNING CONTENT

) AS xml_query_results

FROM DUAL;

XML_QUERY_RESULTS

<product name=”Chemistry” product_type=”Book”x/product>

<product name=”Supernova” product_type=”Video”x/product>

Рассмотрим более подробно выражение XQuery данного примера.

■ Используются две переменные связи: $product и $product_type. Эти

переменные используются для хранения товаров и типов товаров.

■ Часть le t выражения устанавливает $product_type в тип товара, выбираемого

из $product. Выражение с правой стороны знака := производит

соединение, используя значение product_type_id, хранящееся