
- •Использование технологии xml при работе с базами данных общие сведения Часть №1. Разработка объектной модели xml-документа. Работа с xml-документами, как источниками данных.
- •Часть №2. Формирование xml на основе реляционных данных с использованием функций языка sql/xml. Хранение xml-документов в базе данных.
- •Порядок выполнения работы
- •Часть №1. Разработка объектной модели xml-документа. Работа с xml-документами, как источниками данных.
- •1.1. Формирование объектной модели xml-документа
- •1.2 Преобразование документов xml в документы html средствами xslt
- •Часть №2. Формирование xml на основе реляционных данных с использованием функций языка sql. Хранение xml-документов в базе данных
- •Импорт схемы данных.
- •2.2 Преобразование данных из табличной реляционной формы в xmltype (формирование xml-документов на основе реляционных данных)
- •2.3. Сохранение xml-документов в реляционной бд.
- •2.3.1 Зарегистрируйте в бд документ xml Schema, разработанный в пункте 1.1.3.
- •2.3.3 Сформируйте выходной xml-документ и сохраните его в созданной таблице с использованием команды “insert into … select ..”
- •Часть №3. Использование Oracle Text как средства полнотекстового поиска. Индексация xml-документов. Разбиение их на секции.
- •Содержание отчета
Часть №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>