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

в $product_type, и $product. Знак / / означает выборку всех элементов.

■ Часть WHERE выбирает только те товары, цена которых превышает 20.

■ Часть order by сортирует результаты по идентификатору товара (по

умолчанию в порядке возрастания).

642 Глава 17

В следующем примере демонстрируется применение следующих функций

XQuery:

■ count ( ) , подсчитывающей число объектов, переданных в нее;

■ avg(), вычисляющей среднее значение чисел, переданных в нее;

■ in teg e r (), обрезающей число и возвращающей целое значение. Функция

in teg e r () находится в пространстве имен xs. (Функции count() и

avg() расположены в пространстве имен fn, на которое автоматически

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

пространство имен при вызове этих функций.)

Следующий пример возвращает тип товара, число товаров для каждого

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

до целого):

□ SELECT ХМLQUERY(

'fo r $product_type in

doc(«/public/product_types.xml»)/product_types/product_type

le t Sproduct :=

doc(«/public/products.xml»)//product[@product_type_id =

$p rod uct_type/@p rod uct_type_id]

return

<product_type name=»{$product_type/@name

num_products=>> {count ( Sproduct)}»

average_price=»{xs:integer(avg($product/§price)) } »

/>'

RETURNING CONTENT

) AS xml_query_results

FROM DUAL;

XML_QUERY_RESULTS

<product_type name=»Book» num_products=»2» average_price=»24»>

</product_type>

<product_type name=»Video» num_products=>>1» average_price=»25»>

</product_type>

Как видно из результата, найдены две книги и одно видео.

Примечание Более подробную информацию о функциях можно получить на странице http://

www.w3.o^R/xqueryoperators. Более подробную информацию о XMLQUERY() можно найти на

странице http://www.sqlx.org.

Сохранение XML в базе данных

В данном разделе рассматривается, как сохранить XML документ в базе

данных и выбрать информацию из хранимого XML.

Файл XML для примера

Вы увидите использование файла XML с именем purchase_order.xml, который

содержит заказ. Этот файл находится в каталоге xml_files, который

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

создается, когда вы распаковываете Zip файл для этой книги. Если вы хотите

следовать примерам, то должны скопировать каталог xml_files в раздел

С на вашем сервере базы данных (если вы используете Linux или Unix,

то можете скопировать данный каталог в один из своих разделов).

Примечание Если вы скопировали каталог xmljile в каталог, расположенный не на С, то вам

необходимо будет отредактировать сценарий xml_schema.sql (вскоре мы рассмотрим этот сценарий).

Содержимое файла purchase_order.xml выглядит следующим образом:

D <?xml v e rs io n= "1 . 0” ?>

<purchase_order>

<customer_order_id>176</customer_order_id>

<order_date>2007-05-17</order_date>

<customer_name>Best Products 456 Inc.</customer_name>

<street>10 Any S tre e t< /stre e t>

<city>Any C ity< /c ity>

<state>CA</state>

<zip>94440</zip>

<phone_number>555-121-1-234</phone_number>

<products>

<product>

<product_id>1</product_id>

<name>Supernova video</name>

<quantity>5</quantity>

</product>

<product>

<product_id>2</product_id>

<name>Oracle SQL book</name>

<quantity>4</quantity>

</product>

</products>

</purchase_order>

В следующих разделах вы увидите, как сохранить файл XML в базе данных.

В примере из реального мира заказ может быть послан по сети Интернет

в сетевой магазин, который отгрузит запрошенные позиции покупателю.

Создание схемы XML для примера

Автор расположил сценарий SQUPlus с именем xml_schema.sql в каталоге

SQL. Сценарий создает пользователя с именем xml_user и паролем xml_

password, а также он создает элементы, используемые в дальнейшем в этой

главе. Пока не запускайте этот сценарий.

Данный сценарий содержит следующие выражения, которые создают

тип объекта с именем t_product (используемый для представления товаров),

вложенную таблицу по имени t_nested_table_product (используется

для представления вложенной таблицы товаров) и таблицу с именем

purchase_order:

644 Глава 17

□ CREATE TYPE t_product AS OBJECT (

product_id INTEGER,

name VARCHAR2(15),

quantity INTEGER

);

/

CREATE TYPE t_nested_table_product AS TABLE OF t_product;

/

CREATE TABLE purchase_order (

purchase_order_id INTEGER CONSTRAINT purchase_order_pk PRIMARY KEY,

customer_order_id INTEGER,

order_date DATE,

customer_name VARCHAR2(25),

street VARCHAR2(15),

c ity VARCHAR2(15),

state VARCHAR2(2),

zip VARCHAR2(5),

phone_number VARCHAR2(12),

products t_nested_table_product,

xml_purchase_order XMLType

) NESTED TABLE products

STORE AS nested_products;

Обратите внимание, что столбец xml_purchase_order имеет тип данных

XMLType, который является встроенным типом базы данных Oracle,