Опубликован: 28.12.2011 | Уровень: для всех | Доступ: свободно
Лекция 11:

Объектные типы данных в Oracle

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >
Массивы 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.

< Лекция 10 || Лекция 11: 1234 || Лекция 12 >
Ярослав Прозоров
Ярослав Прозоров

В лекции № 7 "Введение в Oracle SQL" в подразделе "Несамостоятельность группировки с обобщениями ROLLUP, CUBE и GROUPING SETS"  представленная таблица сравнения содержит ошибки - окончания запросов пропущены. Видимо, ошибки вызваны некорректным переносом материала лекции.

Володимир Миколайчук
Володимир Миколайчук
Помогите разобраться поетапно с логикой запроса
-------TOOLS
NAME PRICE TYPE
drill 155 A
sawzall 192 N
mitre saw 292 M
router 86 I
RAD 145 M
jigsaw 128 I
screwdriver 77 P
------TOOL_TYPES
TYPE USAGE
A Always
I Often
M Sometimes
N Rarely
P Never

Запрос SQL:
SELECT t.type, SUM(t.price)
FROM tools t
GROUP BY t.type
HAVING SUM(t.price) >= (SELECT AVG(price)
FROM tools
WHERE type IN (SELECT type
FROM tool_types
WHERE usage = 'Often'));

И сколько строк он все таки вернет
Жанбек Сарсенов
Жанбек Сарсенов
Россия, Москва, Московский Государственный Университет имени Ломоносова М.В., 2002