(например пользователя 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: / /
Давайте рассмотрим брлее сложный пример. Следующей оператор (содержащийся
в сценарии xml_examples.sql) создает процедуру с именем