В лекции № 7 "Введение в Oracle SQL" в подразделе "Несамостоятельность группировки с обобщениями ROLLUP, CUBE и GROUPING SETS" представленная таблица сравнения содержит ошибки - окончания запросов пропущены. Видимо, ошибки вызваны некорректным переносом материала лекции. |
Объектные типы данных в Oracle
Массивы VARRAY
По внутренней технической организации хранят списки в полях типов LOB по правилам, допускаемым для этих типов: как вместе со строкой таблицы (короткие списки), так и в отдельном сегменте LOB (длинные списки). В любом случае специальной вспомогательной таблицы для хранения значений массива здесь не требуется. Простой пример:
CREATE TYPE addresslist_typ IS VARRAY ( 5 ) OF address_type; / CREATE TABLE participants ( name VARCHAR2 ( 20 ) , locations addresslist_typ );
При создании таблицы со столбцом-массивом VARRAY не требуется приводить дополнительных указаний (как для столбца вложеной таблицы), однако имеется возможность их применить при необходимости в том.
Добавление и выборка данных внешне не отличается от осуществляемых для вложеной таблицы, например:
INSERT INTO participants VALUES
( 'Einstein'
, addresslist_typ ( address_type ( '123456', 'Archangelsk' )
, address_type ( '789012', 'Samara' )
-- конструкторы простого объекта
)
-- конструктор массива VARRAY
);
Перевод данных в коллекции к табличному представлению и другие возможности
Хотя столбец-коллекция в таблице может показаться удобным для моделирования данных предметной области, работать с такими данными в SQL не обязательно просто. На помощь в этом приходит особая функция TABLE. Она придумана для "разворачивания" элементов коллекции в список строк, к которому можно уже привычным образом применять охватывающие запросы.
Примеры:
SELECT * FROM TABLE ( SELECT colours FROM colour_models WHERE model_type = 'RGB' ); SELECT * FROM TABLE ( SELECT locations FROM participants WHERE name = 'Einstein' );
Упражнение. Проверьте работу последних приведенных запросов.
Для разворачивания многоуровневых коллекций предусмотрен особый случай употребления функции TABLE в сочетании с соединением (join).
Кроме того, ряд возможностей по программной обработке данных-коллекций предусмотрен в PL/SQL.
Различия в употреблении
Вложенные таблицы и массивы VARRAY различаются по содержательному употреблению и технике исполнения. Формальные свойства употребления вложенных таблиц и массивов VARRAY, хотя большей частью совпадают, имеют и естественные различия. Например, с версии 10 для определенного класса вложенных таблиц (элементы которых допускают сравнение друг с другом, в частности, встроенных скалярных типов) возможны множественные операции. Еще пример — только для вложенных таблиц возможна проверка на пустоту:
SQL> SELECT 'ok' FROM dual WHERE colourset_typ ( ) IS EMPTY; 'O -- ok
Тип XMLTYPE
Этот встроенный объектный тип для работы в БД с документами XML появился в версии 9.0. До этого наиболее подходящим для хранения документов XML был тип CLOB. Тип XMLTYPE технически может либо по-прежнему базироваться на CLOB, либо иметь в БД структуру объекта (начиная с версии 9.2 и при использовании XML DB). Помимо пользовательской направленности тип XMLTYPE активно применяется в последних версиях Oracle для внутренней организации БД.
СУБД и БД Oracle предлагают широкий спектр возможностей по использованию типа XMLTYPE в связи с документами XML. Ниже приводятся только простые ознакомительные примеры.
Простой пример
Создание и пополнение таблицы, в которой решено хранить описания книг в формате XML — ради сохранения формата источника или же в силу отсутствия фиксированной структуры у описания книги:
CREATE TABLE books ( id NUMBER , description XMLTYPE ); INSERT INTO books VALUES ( 100 , xmltype ( '<?xml version="1.0"?> <cover> <title>Java Programming with Oracle JDBC</title> <author>Donald Bales</author> <publisher>OReilly and Associates</publisher> <pubdate>December 2001</pubdate> <isbn>0-596-00088-x</isbn> <pages>496</pages> </cover>' ) ); -- ... здесь Oracle разрешает вместо конструктора XMLTYPE ( '...' ) написать просто '...' SET LONG 1000 SELECT id, description FROM books; SELECT id, b.description.XMLDATA FROM books b;
XMLDATA — специально созданный для XMLTYPE "псевдостолбец". В данном примере его может заменить метод GETCLOBVAL() типа XMLTYPE, один из многих существующих.
Упражнение. Попробуйте занести в поле DESCRIPTION неправильно оформленный документ XML и проследите реакцию СУБД.
Пример выборки с использованием условия отбора на языке XPath:
SELECT id, b.description.GETCLOBVAL ( ) FROM books b WHERE b.description.EXISTSNODE('/cover[author="Donald Bales"]')=1;
Таблицы данных XMLTYPE
По аналогии с таблицами объектов, проектируемых самостоятельно, можно создавать таблицы документов XMLTYPE:
CREATE TABLE xbooks OF XMLTYPE;
Работать с ними можно как и с прочими таблицами объектов:
INSERT INTO xbooks VALUES ( xmltype ( '<?xml version="1.0"?> <cover> <title>Java Programming with Oracle JDBC</title> <author>Donald Bales</author> <publisher>OReilly and Associates</publisher> <pubdate>December 2001</pubdate> <isbn>0-596-00088-x</isbn> <pages>496</pages> </cover>' ) ); -- ... здесь Oracle разрешает вместо XMLTYPE ( '...' ) указать просто '...' SELECT x.GETCLOBVAL ( ) FROM xbooks x;
В этом примере данные XML будут храниться как CLOB. Более сложный пример — создание таблиц объектов типа XMLTYPE, где документы XML хранятся в виде таблицы объектов, а не как CLOB. Вот как это могло бы выглядеть в какой-нибудь БД типа лицами объективно, и в силу отсутствия фиксированной структуры описания книгой области:
CREATE TABLE oxbooks OF XMLTYPE XMLSCHEMA "http://www.oracle.com/xbooks.xsd" ELEMENT "Book" ;
Чтобы таблица OXBOOKS была таким образом заведена в действительности, требуется, чтобы схема XML http://www.oracle.com/xbooks.xsd была предварительно определена ("зарегистрирована") в "репозитарии" XML DB (сама XML DB со своим репозитарием автоматически включена в состав типовым образом созданной БД). Достоинство такого описания столбца XMLTYPE в том, что он позволяет хранить не произвольные документы XML, а только типизированные схемой XML. Тем самым зарегистрированная схема XML используется как средство ограничения целостности хранимых данных XML, налагаемое в таблице Oracle по правилам технологии XML.