
- •Введение
- •1. Достоинства и недостатки реляционной и объектной моделей Задачи, недоступные для реляционного подхода
- •Задачи, недоступные для объектного подхода
- •Задачи, недоступные обеим моделям
- •2. Реализация объектного подхода в oracle
- •2.1. Хранение объектов в столбцах реляционных таблиц
- •2.2. Создание таблицы объектов
- •2.3. Ссылки на объект
- •2.4. Методы объектов
- •2.5. Конструкторы
- •2.6. Статические методы
- •2.7. Методы сравнения
- •2.8. Объектные представления
- •3. Реализация механизма наследования объектов в oracle
- •3.1. Особенности наследования объектов в oracle
- •3.2. Абстрактные объекты
- •4. Реализация полиморфизма в субд oracle
- •4.1. Полиморфизм типов
- •4.2. Расширение и сужение объектных типов
- •4.3. Оператор is of
- •4.4. Виртуальные методы
2. Реализация объектного подхода в oracle
В результате широкого распространения объектно-ориентированного подхода лидеры в производстве реляционных СУБД стремятся наделить свои продукты объектно-ориентированными возможностями, чтобы повысить конкурентоспособность своих продуктов. Компания ORACLE здесь не стала исключением.
В целом объектная реализация в ORACLE традиционна для объектного подхода вообще. Строго говоря, СУБД ORACLE не является объектной. Точнее будет сказать, что в СУБД ORACLE есть объектное расширение – возможности по созданию и использованию объектов, причем возможности эти несколько ограничены по сравнению с большинством языков высокого уровня.
Ограничения, в частности, касаются слабой реализации принципа инкапсуляции (все свойства и методы объектов являются открытыми), нет возможности вызывать перегруженные методы предков и т.д. Тем не менее, объектная модель ORACLE развивается от версии к версии, и ее возможностей уже сейчас вполне достаточно для решения большинства задач методами объектно-ориентированного подхода.
2.1. Хранение объектов в столбцах реляционных таблиц
Например, для описания некоторого абстрактного адреса создадим тип:
CREATE OR REPLACE TYPE address_typ AS OBJECT( Zip CHAR(6),
City varchar2(20),
Location VARCHAR2(50)); /
Примечание: объекты, как и пакеты, имеют интерфейс и реализацию. И также как и пакеты, создаются в два этапа – сначала заголовок (интерфейс), потом тело (реализация). В том случае, когда объект не содержит методов, тело объекта не указывается.
-- воспользуемся этим типом для описания отделов:
CREATE TABLE DEPARTMENTS(
Dep_Id NUMBER CONSTRAINT departments_pk PRIMARY KEY,
Caption VARCHAR2 (50),
Addr address_typ
);
CREATE SEQUENCE Departments_seq;
-- заведем отдел и изменим данные некоторых сотрудников:
INSERT INTO Departments VALUES
(Departments_seq.NEXTVAL, 'Отдел продаж',
NEW address_typ('141980', 'Дубна', 'Университетская, 19'));
Здесь выражение NEW address_typ('141980', 'Дубна', 'Университетская, 19') означает обращение к конструктору объекта.
Примечание: каждый объект имеет свой конструктор по умолчанию, создаваемый СУБД автоматически при компиляции объекта. Но программист имеет возможность создавать и собственные конструкторы.
-- выполним запросы к полям, содержащим объекты:
SELECT d.Caption, d.Addr.ZIP, d.Addr.City, d.Addr.Location FROM Departments d;
Примечание: перед именем поля, содержащим объект, необходимо указывать название таблицы.
2.2. Создание таблицы объектов
Кроме хранения объектов в полях реляционных таблиц существует возможность хранить объекты и в специальных объектных таблицах – таблицах, хранящих только объекты одного какого-то типа. Пример создания объектной таблицы для хранения адресов:
CREATE TABLE Addresses OF address_typ;
Таблицы объектов в ORACLE было бы точнее называть списками объектов, так как это всегда таблицы ровно из одного столбца объектного типа.
-- заполнение данными происходит, как и ранее:
INSERT INTO Addresses VALUES(
NEW address_typ('141980', 'Дубна', 'Университетская, 19'));
-- либо с неявным вызовом конструктора по умолчанию
INSERT INTO Addresses VALUES('141980', 'Дубна', 'Университетская, 19');
-- для выборки отдельных свойств объектов из объектных таблиц
SELECT a.zip, a.city, a.location FROM Addresses a;
-- для выборки всего объекта целиком (например, для передачи в качестве
-- параметра какой-нибудь процедуре) используется функция VALUE:
SELECT VALUE(a) FROM Addresses a;
Примечание: функция VALUE специально придумана для возвращения значений объектов, а не атрибутов объектов по отдельности.