позволяющим хранить данные 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(). Обратите внимание, что формат даты