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

позволяющим хранить данные XML. По умолчанию, столбец XMLType

хранит данные XML в виде текста или CLOB (большого символьного объекта).

Сценарий xml_schema.sql также содержит следующий оператор, создающий

объект каталога с именем XML_FILES_DIR:

□ CREATE OR REPLACE DIRECTORY XML_FILES_DIR AS ’C A xm l.file s - ;

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

раздел, отличный от С. Если вам нужно изменить эту строку, сделайте это

прямо сейчас и сохраните сценарий.

Следующий оператор INSERT (также принадлежащий данному сценарию)

добавляет строку в таблицу purchase_order:

□ INSERT INTO purchase_order (

purchase_order_id,

xml_purchase_order

) VALUES (

1 ,

XMLType(

BFILENAME(‘ XML_FILES_DIR’ , ‘ purchase_order.xml’ ),

NLS_CHARSET_ID(' AL32UTF8’ )

))

;

Как можно увидеть, конструктор XMLTypeO принимает два параметра.

Первый параметр представляет собой BFILE, являющийся указателем на

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

внешний файл. Второй параметр является набором символов (кодировкой)

для текста XML во внешнем файле. В вышеприведенном операторе

INSERT параметр BFILE указывает на файл purchase_order.xml, а кодировка

установлена как AL32UTF8, что является стандартной кодировкой UTF-8.

Когда выполняется INSERT, то XML из файла purchase_order.xml будет прочитан

и сохранен в базе данных как текст CL0B в столбце xml_purchase_

order.

Примечание Когда вы работаете с файлами XML, написанными на английском языке, то вам

требуется использовать кодировку AL32UTF8. Вы можете найти более полную информацию о

различных кодировках в руководстве Oracle Database Globalization Support Guide (Руководству

по поддержке глобализации баз данных), публикуемому корпорацией Oracle.

Вы могли обратить внимание, что столбцы customer_order_id, order_

date, customer_name, street, city, state, zip, phone_number и products в таблице

purchase_order не содержат данных. Данные для этих столбцов выбираются

из XML, хранящегося в столбце xml_purchase_order. Ниже в данной главе

мы рассмотрим процедуру PL/SQL, читающую XML и устанавливающую

соответствующие значения для других столбцов.

Запустите сценарий xml_schema.sql с правами привилегированного

пользователя (такого, как пользователь system):

П CONNECT system/manager

@ “ E :\ 0 ra c le SQL book\sql_book\SQL\xml_schema.sql"

После завершения сценария вы будете подключены к базе данных как

пользователь xml_user.

Выборка информации из схемы XML примера

В данном разделе, мы увидим, как выбирать информацию из схемы xml_

user.

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

□ SET LONG 1000

SET PAGESIZE 500

SELECT purchase_order_id, xml_purchase_order

FROM purchase_order;

PURCHASE_0RDER_ID

XML_PURCHASE_0RDER

1 <?xml version=” 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 Street</street>

<city>Any City</city>

<state>CA</state>

<zip>94440</zip>

646 Глава 17

<phone_number>555-121-1234</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>

Следующий запрос выбирает customer_order_id, order_date, customer_

name и phone_number из XML, хранящегося в столбце xml_purchase_order,

при помощи функции

□ EXTRACT( ) :

SELECT - *

EXTRACT( xml_pu rchase_o rde г,

' /purchase_order/customer_order_id’ ) cust_order_id,

EXTRACT(xml_purchase_order, ‘ /purchase_order/order_date’ ) order_date,

EXTRACT(xml_purchase_order, ‘ /purchase_order/customer_name’ ) cust_

name,

EXTRACT(xml_purchase_order, ' /purchase_order/phone_number’ ) phone_

number

FROM purchase_order

WHERE purchase_order_id = 1;

CUST_ORDER_ID

ORDER_DATE

CUST_NAME

PHONE_NUMBER

<customer_order_id>176</customer_order_id>

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

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

<phone_number>555-121-1234</phone_number>

Функция EXTRACT ( ) возвращает значения как объекты типа XMLType.

Можно использовать функцию EXTRACTVALUE() для получения значения в

виде строки. Например, следующий запрос выбирает те же значения как

строки, используя функцию EXTRACTVALUE():

П SELECT

EXTRACTVALUE(xml_purchase_order,

‘ /purchase_order/customer_order_id’ ) cust_order_id,

EXTRACTVALUE(xml_purchase_order,

' /purchase_order/order_date’ ) order_date,

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

EXTRACTVALUE(xnl_purchase_order,

‘ /purchase_order/customer_name’ ) cust_name,

EXTRACTVALUE(xml_purchase_order,

‘ /purchase_order/phone_number’ ) phone_number

FROM purchase_order

WHERE purchase_order_id = 1;

CUST_ORDER_ID

ORDER DATE

CUST_NAME

PHONE_NUMBER

176

2007-05-17

Best Products 456 Inc.

555-121-1234

Следующий запрос выбирает и преобразует order_date в тип данных

DATE, используя функцию T0_DATE(). Обратите внимание, что формат даты