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

(например пользователя system) и дать права CREATE ANY DIRECTORY пользователю

store:

□ CONNECT system/manager;

GRANT CREATE ANY DIRECTORY TO store;

Далее необходимо войти в базу данных как пользователь store и создать

объект каталога:

□ CONNECT store/store_password;

CREATE DIRECTORY TEMP_FILES_DIR AS ’ C:\temp_files’ ;

Вам также понадобится создать папку по имени temp_flles в разделе С.

(Если вы используете Linux или Unix, то вы можете создать папку в одном

из ваших разделов и использовать соответствующую команду CREATE

DIRECTORY с правильным путём. Убедитесь также, что вы предоставили разрешение

на запись в эту папку для учётной записи пользователя Oracle,

которая использовалась при установке программного обеспечения базы

данных.)

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

После этого требуется запустить сценарий xml_exaraples.sql, расположенный

в каталоге SQL, как показано ниже:

□ @”E:\0racle SQL Book\ sql_book\SQL\xml_examples.sql”

Предостережение В данном случае запустите только сценарий xml_examples.sql. Вы можете

увидеть в каталоге SQL сценарий с именем xml_schema.sql. Пока не запускайте xml_schema.sql.

Сценарий xml examples. s q l создает две процедуры; в этом разделе вы

увидите процедуру w rite _ xm l_ d a ta _ to _ file ( ), которая выбирает имена покупателей

и записывает их в файл XML. Процедура write_xml_data_to_

f i l e ( ) определена следующим образом:

□ CREATE PROCEDURE w rite _ xm l_ d a ta _ to _ file (

p _ d ire c to ry VARCHAR2,

p_file_name VARCHAR2

) AS

v _ f ile UTL_FILE.FILE_TYPE;

v_amount INTEGER := 32767;

v_xml_data XMLType;

v _ ch a r_ b u ffe r VARCHAR2(32767);

BEGIN

- - открываем файл для записи текста (до v_amount

- - символов за раз)

v _ f ile := UTL_FILE.FOPEN( p _ d ire c to r y , p_file_name, 'wv_amount ) ;

- - записываем начальную строку в файл

UTL_FILE.PUT_LINE(v_file, '<?xml version=»1. 0»?>');

— выбираем пользователей и сохраняем их в v_xml_data

SELECT

EXTRACT(

XMLELEMENT(

«customer_list>>,

XMLAGG(

XMLELEMENT(«customer», first_n am e || ' ' || last_name)

ORDER BY last_name

)

),

'/ c u s t o m e r _ lis t '

)

AS xml_customers

INTO v_xml_data

FROM customers;

— выбираем строковое значение из v_xml_data и сохраняем его в v_char_

b u ffe r

v _ ch a r_ b u ffe r := v_xml_data.GETSTRINGVAL();

- - копируем символы из v _ ch a r_ b u ffe r в файл

UTL_FILE.PUT(v _ f i l e , v _ c h a r_ b u ffe r);

- - записываем буфер оставшихся данных в файл

638 Глава 17

UTL_FILE.FFLUSH( v _ f i le ) ;

— закрываем файл

UTL_FILE.FCLOSE(v_file);

END write_xml_data_to_file;

/

Следующее выражение вызывает write_xml_data_to_f i l e ( ):

□ CALL write_xml_data_to_file('TEMP_FILES_DIR', ' customers.xml );

После запуска этого оператора вы найдете файл с именем customers,

xml в каталоге C:\temp_files или в том каталоге, который был указан в

предыдущей команде CREATE DIRECTORY. Файл customers.xml содержит следующее:

□ <?xml version=»1.0»?>

<customer_listxcustomer>Gail Black</customer><customer>Doreen Blue

</customer><customer>John Brown</customer><customer>Cynthia Green

</customer><customer>Steve White</customerX/customer_list>

Вы можете модифицировать процедуру write_xml_data_to_file() для

выбора любых реляционных данных из базы данных и записи их в файл

XML.

XMLQUERYO

XMLQUERY() используется для создания XML или запроса XML. В XMLQUERY()

передается выражение XQuery. XQuery представляет собой язык запросов,

позволяющий создавать и запрашивать XML. ХМ LQU ERY ( ) возвращает

результат выражения XQuery.

Следующий пример иллюстрирует использование XMLQUERYO:

□ SELECT XMLQUERY(

‘ (1, 2 + 5, “d” , 155 to 161, <A>text</A>)’

RETURNING CONTENT

) AS xml_output

FROM DUAL;

XML_OUTPUT

1 7 d 155 156 157 158 159 160 161<A>text</A>

Несколько замечаний к данному примеру,

■ Строка, передаваемая в XMLQUERYO, представляет собой выражение

XQuery, то есть строка (1,2 + 5, "d", 155 to 161, <A>text</A>) является

выражением XQuery. В этой строке цифра 1 является целочисленным

литералом, 2 + 5 — арифметическим выражением, d — литералом

строки, 155 to 161 является последовательностью целых чисел, а

<A>text</A> - элементом XML.

■ Все элементы XQuery вычисляются по очереди. Например, вычисляется

2 + 5 и возвращается 7. Аналогично вычисляется 155 до 161 и

возвращается 155 156 157 158 159 160 161.

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

■ RETURNING CONTENT означает, что возвращается фрагмент XML. Фрагмент

XML представляет собой одиночный элемент XML с любым количеством

«детей», которые сами могут принадлежать любому типу

XML, включая текстовые элементы. Фрагмент XML совместим с расширенной

моделью данных Infoset. Infoset представляет собой спецификацию,

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

XML. Более подробно об Infoset можно узнать на странице http: / /

www.w3.org/TR/xml-infoset.

Давайте рассмотрим брлее сложный пример. Следующей оператор (содержащийся

в сценарии xml_examples.sql) создает процедуру с именем