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, хранящееся