
- •Введение
- •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. Виртуальные методы
4.3. Оператор is of
Для того чтобы отобрать объекты какой-то конкретной ветки иерархии объектов используют оператор IS OF. Например, следующий запрос вернет имена только тех объектов из поля employee таблицы Employees, которые имеют тип boss_typ или более конкретный:
SELECT e.employee.Name FROM Employees e WHERE employee IS OF (boss_typ);
Для того чтобы в выборке присутствовали объекты только одного какого-то типа, оператор IS OF дополняют параметром ONLY:
SELECT e.employee.Name FROM Employees e WHERE employee IS OF (ONLY boss_typ);
4.4. Виртуальные методы
Подтип может переопределять любой из нетерминальных методов (non-final member methods), определенных для его супертипа, и предоставлять другую реализацию. Когда вызывается метод некоторого экземпляра объекта, осуществляется диспетчеризация метода и вызов конкретной реализации в зависимости от наиболее специализированного типа данного экземпляра.
Пример:
Дополним описанные ранее объекты методом PRINT, причем в объекте employee_typ этот метод должен быть нетерминальным для того, чтобы он мог быть переопределен в подтипах:
DROP TABLE Employees;
DROP SEQUENCE Employees_seq;
DROP TYPE sales_manager_typ;
DROP TYPE boss_typ;
CREATE OR REPLACE TYPE employee_typ IS OBJECT(
Name VARCHAR2(30),
Hire_Day DATE,
MEMBER FUNCTION DaysAtCompany RETURN NUMBER,
NOT FINAL NOT INSTANTIABLE MEMBER FUNCTION PRINT RETURN VARCHAR2
)
NOT INSTANTIABLE
NOT FINAL;
/
Здесь метод PRINT объекта employee_typ был объявлен как NOT INSTANTIABLE. Это означает, что метод является абстрактным и должен быть реализован у подтипов.
CREATE OR REPLACE TYPE BODY employee_typ IS
MEMBER FUNCTION DaysAtCompany RETURN NUMBER IS
BEGIN
RETURN TRUNC(sysdate-Hire_Day);
END;
END;
/
CREATE OR REPLACE TYPE boss_typ UNDER employee_typ(
OVERRIDING MEMBER FUNCTION PRINT RETURN VARCHAR2
);
/
CREATE OR REPLACE TYPE BODY boss_typ IS
OVERRIDING MEMBER FUNCTION PRINT RETURN VARCHAR2 IS
BEGIN
RETURN ‘boss’;
END;
END;
/
CREATE OR REPLACE TYPE sales_manager_typ UNDER employee_typ(
Dep department_typ,
OVERRIDING MEMBER FUNCTION PRINT RETURN VARCHAR2
);
/
CREATE OR REPLACE TYPE BODY sales_manager_typ IS
OVERRIDING MEMBER FUNCTION PRINT RETURN VARCHAR2 IS
BEGIN
RETURN ‘sales manager’;
END;
END;
/
CREATE TABLE Employees(
emp_id NUMBER,
employee employee_typ
);
CREATE SEQUENCE Employees_seq;
INSERT INTO Employees VALUES(Employees_seq.NEXTVAL, boss_typ(‘Петр Иванович Сидоров’, to_date(’12.03.2004’,’dd.mm.yyyy’)));
INSERT INTO Employees VALUES(Employees_seq.NEXTVAL, sales_manager_typ( ‘Вася’, to_date(’12.03.2004’,’dd.mm.yyyy’), department_typ(1,’Отдел продаж’)));
SELECT e.Name, e.employee.PRINT() FROM Employees e;