Кубанский государственный университет
Опубликован: 24.12.2013 | Доступ: свободный | Студентов: 682 / 9 | Длительность: 24:28:00
Лекция 10:

Объектные модели данных

Пакеты

Пакет это набор программных объектов, как правило, связанных общей семантикой и использующих общие данные. При ссылке на какой-нибудь объект пакета, в память загружается весь пакет, и все его объекты становятся доступными. Пока имеются ссылки на пакет, он остается в памяти.

Пакет состоит из двух частей:

  • спецификация или заголовок пакета;
  • тело пакета.

Заголовок пакета содержит спецификации переменных, типов данных, процедур, функций и курсоров которые предполагается сделать доступными извне. Здесь нет программного кода. Курсоры —это стандартное средство для реализации запросов SQL. Мы их не будем рассматривать.

Спецификация может быть скомпилирована и при отсутствии тела пакета.

Тело пакета содержит код всех перечисленных в спецификации модулей. Может содержать описания переменных и других объектов, но все они локальны и не доступны извне пакета.

Тело пакета успешно компилируется только вместе со спецификацией, либо если спецификация была скомпилирована раньше.

Мы не можем заниматься пакетами подробно. Приведём лишь несколько вариантов их использования. Мы уже работали с функцией PUT_LINE пакета DBMS_OUTPUT.

Функция GET_DDL пакета DBMS_METADATA позволяет получить тексты определения любого хранимого объекта базы. Рассмотрим примеры её применения.

  • Запрос описания функции

    SELECT dbms_metadata.get_ddl('PROCEDURE',
    'имя_таблицы', 'имя_схемы') FROM dual;
    

    Например, для только что созданной функции circle_area:

    SELECT dbms_metadata.get_ddl('FUNCTION', 'CIRCLE_AREA', 'HR')
    FROM dual;
    
  • Запрос описания таблицы

    SELECT dbms_metadata.get_ddl('TABLE',
    'имя_таблицы', 'имя_схемы') 
    FROM dual;
    

    Оказывается в только что созданной таблице qq было задано по умолчанию много параметров. Запрос

    SELECT dbms_metadata.get_ddl('TABLE','QQ','HR') 
    FROM dual;
    

    возвращает текст:

    CREATE TABLE
    "HR"."QQ"   ("C1" CHAR(10),"C2" NUMBER(*,0)) 
    PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255 NOCOMPRESS LOGGING 
    STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645 PCTINCREASE 0
    FREELISTS 1 FREELIST GROUPS 1 BUFFER_POOL DEFAULT) TABLESPACE "USERS"
    

    Здесь параметры блока PCTFREE и PCTUSED, которые станут понятны после освоения следующей "Хранение данных и доступ к ним" , и задание совершенно не нужного таблице qq сегмента 64 Кбайт, и указание табличного пространства USERS, в котором таблица находится и многое другое.

    Здесь мы не можем заниматься всеми деталями. Ясно одно, в Oracle краткое задание таблицы это плохое задание.

    Обратите внимание на то, что все текстовые константы в запросах переводятся в верхний регистр и помещаются в одинарные кавычки.

  • Запрос описания пользователя

    SELECT dbms_metadata.get_ddl('USER',
    'имя_пользователя') 
    FROM dual;
    
10.3.2 Объектные типы данных

Теперь мы готовы заниматься объектно-реляционными базами.

Объекты могут быть постоянными и временными. Хранимый (persistent) объект может быть как значением столбца обычной таблицы, так и строкой таблицы (в этом случае таблицу называют объектной).

Временный (transient) объект создается в памяти и уничтожается после окончания работы программы. Отправив такой объект в базу данных вы делаете его постоянным. А постоянный объект можно извлечь из базы данных и поместить его во временный объект такого же или совместимого типа.

Тип объекта, то есть абстрактный тип данных и методы, всегда хранится в словаре. Экземпляр хранимого объекта помещается в таблицы (одну или более) как значение столбца или строка объектной таблицы.

Выборка и манипулирование хранимыми объектами в базе данных осуществляется на языке SQL, начиная с третьей версии. Для работы с временными объектами на сервере предназначен язык PL/SQL. Язык C++ позволяет работать с объектами на стороне клиента. Используются вызовы программ на C++ из PL/SQL. В Java можно работать на всех трёх слоях клиент-серверной архитектуры.

Можно выделить следующие разновидности объектных типов:

  • простой объектный тип, который строится на скалярных предопределённых типах данных;
  • составной объектный тип, использующий другие объектные типы;
  • ссылочный объектный тип;
  • типы коллекций двух разновидностей VARRAY и NESTED TABLES.

Ссылочный объектный тип REF это логический указатель, определяющий отношения между экземплярами классов. Он основывается на одноэлементных или коллекционных типах данных. Указатели REF задают ассоциации UML и заменяют внешние ключи, предоставляя прямую навигацию между объектами разных типов.

VARRAY - это упорядоченная коллекция фиксированной длины. Хранится в сегменте таблицы, использующей такой тип.

Вложенная таблица это неограниченная и неупорядоченная коллекция. Хранится в своём сегменте, не совпадающем с сегментом основной таблицы. Последняя фраза станет понятной после изучения следующей "Хранение данных и доступ к ним" .

Создание пользовательского типа данных

Создадим тип данных dept_type, описывающий таблицу dept (рисунок 10.32). Затем создадим таблицу emp_dept (то есть emp включающую в себя dept).

Создание типа данных dept_type

увеличить изображение
Рис. 10.32. Создание типа данных dept_type

Заметьте, что в окне можно держать несколько инструкций, но исполняемая инструкция должна быть выделена как на (на рисунке 10.32.

Ранее использованные в текущем сеансе инструкции можно вызвать, нажав на History, и в появившемся внизу окне кликнуть левой кнопкой мыши на нужной команде.

А теперь получим информацию о созданном типе данных из представления словаря USER_TYPE_ATTRS (таблица 10.10).

Таблица 10.10. Получение информации о типе dept_type
SELECT type_name, attr_name, attr_type_name FROM user_type_attrsWHERE    type name='DEPT TYPE';
TYPE_HAME ATT R_ NAME ATT R_TYPE_ NAME
DEPTTYPE DEPTNO NUMBER
DEFTJYPE DNAME VARCHAR2
DEPT_TYPE LOC VARCHAR2

Можно использовать аналогичное представление dba_type_attrs. Его структура показана в таблице 10.11.

Таблица 10.11. Представление dba_type_attrs
Столбец Описание столбца

OWNER

TYPENAME

ATTRNAME

ATTR_TYPE_MOD

ATTR_TYPE_OWNER

ATTR_TYPE_NAME

LENGTH

PRECISION

SCALE

CHARACTER_SET_NAME

ATTRNO

Владелец типа

Имя типа

Имя атрибута

Модификатор атрибута типа

Владелец атрибута типа

Имя типа атрибута

Длина для атрибутов CHAR/VARCHAR

Точность для атрибутов типа number

Диапазон для числового типа

Имя таблицы символов

Номер атрибута