Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
10 XML (TBD).doc
Скачиваний:
5
Добавлен:
19.11.2019
Размер:
223.74 Кб
Скачать

Часть №2. Формирование xml на основе реляционных данных с использованием функций языка sql/xml. Хранение xml-документов в базе данных.

ТЕОРЕТИЧЕСКИЕ СВЕДЕНИЯ

2.1 Преобразование из табличной реляционной формы в XMLTYPE

Формирование XML-документов на основе реляционных данных осуществляется с использованием следующих функций СУБД Oracle:

- XMLElement;

- XMLAttributes;

- XMLAgg;

- XMLConcat;

- XMLForest;

- XMLPI;

- XMLRoot.

//----------------------------------------------------------------------------------------------------

В данных функциях название элемента XML-документа всегда задается в двойных кавычках.

//----------------------------------------------------------------------------------------------------

Функция XMLElement преобразует реляционные данные (например, значение столбца таблицы БД) в элемент XML-документа (для работы с XML-документом используется тип данных XMLType).

Функция XMLAttributes используется внутри функции XMLElement и преобразует реляционные данные в атрибут элемента XML-документа.

Функция XMLAgg объединяет несколько значений РАЗЛИЧНЫХ ОБЪЕКТОВ, имеющих тип данных XMLType в один экземпляр (применительно к нескольким строкам SELECT-запроса). Применяется в запросах, содержащих групповые и аналитические функции.

Функция XMLConcat объединяет несколько значений РАЗЛИЧНЫХ СТОЛБЦОВ, имеющих тип данных XMLType в один экземпляр.

Функция XMLForest формирует набор («лес») XML-элементов из заданного набора аргументов.

Функция XMLPI генерирует набор инструкций обработки XML-документа (теги

<? … ?>).

Функция XMLROOT генерирует корневой элемент XML-документа и (тег <? xml ?>).

Примеры использования данных функций:

а) генерация элемента XML-документа, значением которого является фамилия сотрудника (для каждого сотрудника отдельный элемент. Элементы относятся к разным объектам XMLType).

SELECT XMLELEMENT("Employee", ename) FROM emp;

б) генерация пустого элемента XML-документа с одним атрибутом, значением которого является фамилия сотрудника (для каждого сотрудника отдельный элемент. Элементы относятся к разным объектам XMLType).

SELECT XMLELEMENT("Employee",

XMLATTRIBUTES(ename AS "Name", empno AS "Number"))

FROM emp;

в) генерация элемента XML-документа, значением которого является фамилия сотрудника, имеющего два атрибута. Значениями атрибутов являются табельный номер сотрудника и номер отдела, в котором он работает (для каждого сотрудника отдельный элемент. Элементы относятся к разным объектам XMLType).

SELECT XMLELEMENT("Employee",

XMLATTRIBUTES(empno AS "EMPNO", deptno AS "DEPTNO"), ename)

FROM emp;

г) генерация XML-документа, состоящего из двух элементов – имени сотрудника и его зарплаты, для каждого сотрудника, зарплата которого превышает 1900. Два элемента объединены в один документ с использованием функции XMLCONCAT. Для каждого сотрудника генерируется отдельный XML-документ.

SELECT XMLCONCAT(

XMLELEMENT("ename", e.ename),

XMLELEMENT("sal", e.sal)

) AS "Result"

FROM emp e

WHERE e.sal>1900;

д) генерация XML-документа, состоящего из 3-х элементов, для каждого из сотрудников. Функция XMLFOREST используется для генерации и объединения сразу нескольких элементов документа.

select XMLFOREST (ename as "Name", sal as "Sal", 'просто текст' as "sss", comm)

from Emp;

е) генерация XML-документа с прологом, в котором указана версия языка XML

SELECT XMLRoot(

XMLFOREST (ename as "Name", sal as "Sal", comm),

VERSION '1.0'

)

from emp

ж) генерация двух элементов XML-документа для каждого отдела. Каждый из этих элементов относится к разным объектам XMLType. Значением первого элемента является название отдела, атрибутом – номер отдела. Второй элемент представляет собой список сотрудников данного отдела (несколько элементов XML-документа, объединённых в 1 с использованием функции XMLAGG).

В таблице emp 14 строк, но в результате будет выведено только 3 – по одной для каждого отдела. Использование функции XMLAGG позволило объединить строки, относящиеся к одному отделу в одну.

SELECT XMLELEMENT("department", XMLATTRIBUTES(deptno AS "no")) dept,

XMLAGG(XMLELEMENT("employee", ename)) employers

FROM emp

GROUP BY deptno;

з) генерация одного XML-документа, содержащего информацию обо всех отделах и их сотрудниках.

В элемент "department" вкладывается несколько объединённых элементов, соответствующих работающим в отделе сотрудникам.

Использование внешней функции XMLAGG позволяет объединить элементы, соответствующие нескольким отделов в один XML-документ.

SELECT XMLAGG(

XMLELEMENT("department", XMLATTRIBUTES(deptno AS "no"),

XMLAGG(

XMLELEMENT("employee", ename)

)

)

) depts

FROM emp

GROUP BY deptno;

2.2 Хранение XML-документов

Для отображения XML-документов, на схему базы данных (т.е. для их хранения в БД) существуют следующие стратегии:

  • Отображение XML-документа как единого объекта, хранимого в БД (например, большой символьный объект CLOB);

  • Отображение XML-документа как единого внешнего объекта, хранимого в файловой системе ОС (с использованием типа данных BFILE, который содержит локаторы внешних объектов в виде пути к файлу);

  • Отображение XML-документа как единого объекта, хранимого в БД с использованием специализированного типа данных XMLType. Возможно создание атрибута таблицы, имеющего этот тип данных (объект XMLType является столбцом таблицы) и создание объектной таблицы (таблица содержит только объекты XMLType);

  • Отображение элементов XML-документов на объектно-реляционные таблицы и колонки в схеме базы данных.

ПРИМЕРЫ ВЫПОЛНЕНИЯ ЗАДАНИЙ

а) Сгенерировать один XML-документ, содержащий информацию обо всех отделах и их сотрудниках. Документ должен иметь пролог; описание документа (XML Schema), которое будет использовано для его валидации; описание XSLT-преобразователя, используемого для его визуализации (преобразования в HTML).

SELECT XMLRoot(

XMLCONCAT(

XMLPI(NAME "xml-stylesheet", 'type="text/xsl" href="dept.xsl"'),

XMLElement("departments",

XMLAttributes('http://www.w3.org/2001/XMLSchema' AS "xmlns:xsi",

'dept.xsd' AS "xsi:nonamespaceSchemaLocation"),

XMLAGG(

XMLELEMENT("department", XMLATTRIBUTES(deptno AS "no"),

XMLAGG(XMLELEMENT("employee", ename))

)

)

)

), VERSION '1.0') as "test"

FROM emp

GROUP BY deptno;

Результат выполнения запроса

<?xml version="1.0"?>

<?xml-stylesheet type="text/xsl" href="dept.xsl"?>

<departments xmlns:xsi="http://www.w3.org/2001/XMLSchema"

xsi:nonamespaceSchemaLocation="dept.xsd">

<department no="10">

<employee>CLARK</employee>

<employee>KING</employee>

<employee>MILLER</employee>

</department>

<department no="20">

<employee>SMITH</employee>

<employee>FORD</employee>

<employee>ADAMS</employee>

<employee>SCOTT</employee>

<employee>JONES</employee>

</department>

<department no="30">

<employee>ALLEN</employee>

<employee>BLAKE</employee>

<employee>MARTIN</employee>

<employee>TURNER</employee>

<employee>JAMES</employee>

<employee>WARD</employee>

</department>

</departments>

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]