Объектные модели данных
Пакеты
Пакет это набор программных объектов, как правило, связанных общей семантикой и использующих общие данные. При ссылке на какой-нибудь объект пакета, в память загружается весь пакет, и все его объекты становятся доступными. Пока имеются ссылки на пакет, он остается в памяти.
Пакет состоит из двух частей:
- спецификация или заголовок пакета;
- тело пакета.
Заголовок пакета содержит спецификации переменных, типов данных, процедур, функций и курсоров которые предполагается сделать доступными извне. Здесь нет программного кода. Курсоры —это стандартное средство для реализации запросов 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).
Заметьте, что в окне можно держать несколько инструкций, но исполняемая инструкция должна быть выделена как на (на рисунке 10.32.
Ранее использованные в текущем сеансе инструкции можно вызвать, нажав на History, и в появившемся внизу окне кликнуть левой кнопкой мыши на нужной команде.
А теперь получим информацию о созданном типе данных из представления словаря USER_TYPE_ATTRS (таблица 10.10).
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.
Столбец | Описание столбца |
---|---|
OWNER TYPENAME ATTRNAME ATTR_TYPE_MOD ATTR_TYPE_OWNER ATTR_TYPE_NAME LENGTH PRECISION SCALE CHARACTER_SET_NAME ATTRNO |
Владелец типа Имя типа Имя атрибута Модификатор атрибута типа Владелец атрибута типа Имя типа атрибута Длина для атрибутов CHAR/VARCHAR Точность для атрибутов типа number Диапазон для числового типа Имя таблицы символов Номер атрибута |