
- •Введение
- •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.7. Методы сравнения
При выполнении операторов ORDER BY, GROUP BY, DISTINCT или операторов сравнения СУБД должна уметь сравнивать объекты между собой. Методы сравнения объектов между собой, используемые СУБД по умолчанию, не всегда могут удовлетворять решаемым задачам, поэтому есть возможность переопределить методы сравнения (аналог перегрузки операции сравнения).
При описании метода объекта можно воспользоваться одним из модификаторов – MAP или ORDER. Метод типа MAP возвращает значение одного из встроенных типов, которое может использоваться в операциях сравнения. Метод типа ORDER сравнивает два объекта и возвращает –1, если первый объект меньше, 0, если оба равны, 1, если первый объект больше.
Сравнение объектов, использующих метод сравнения типа MAP, гораздо быстрее, чем объектов, использующих метод сравнения типа ORDER.
Если метод сравнения не задан вообще, объекты этого типа можно сравнивать только на равенство/неравенство. При этом объекты будут считаться равными, только если все их атрибуты не-NULL и равны.
CREATE OR REPLACE TYPE datetime IS OBJECT(
CurDateTime DATE,
STATIC PROCEDURE PrintDateTime,
ORDER MEMBER FUNCTION compare(other datetime) RETURN NUMBER
);
/
CREATE OR REPLACE TYPE BODY datetime IS
STATIC PROCEDURE PrintDateTime AS
BEGIN
Dbms_output.put_line(sysdate); END;
ORDER MEMBER FUNCTION compare(other datetime) RETURN NUMBER IS
BEGIN
IF SELF.CurDateTime<other.CurDateTime THEN RETURN -1;
ELSIF SELF.CurDateTime=other.CurDateTime THEN RETURN 0;
ELSE RETURN 1;
END IF;
END;
END;
/
set serveroutput on
declare
dt1 datetime:=datetime(sysdate);
dt2 datetime:=datetime(sysdate+1);
begin
if dt1<dt2 then
dbms_output.put_line(dt1.CurDateTime || ‘ меньше, чем ’
|| dt2.CurDateTime);
else
dbms_output.put_line(dt1.CurDateTime ||
‘ больше или равно, чем ’ || dt2.CurDateTime);
end if;
end;
/
2.8. Объектные представления
Переводить в существующей БД табличные описания данных в объектную форму не всегда возможно, а иногда и не нужно. В силу разных обстоятельств может оказаться удобной имитация объектов на основе данных, хранимых в традиционных таблицах. Тогда к одним и тем же данным можно обращаться и через объектный интерфейс, и через реляционный. Достигается это с помощью объектных представлений (object views), которые можно так назвать по аналогии с представлениями (views).
Объектное представление – это представление с одной колонкой (очень похожи на таблицы объектов), где хранятся объекты, формирующиеся динамически на основе табличных данных.
Примечание: понятие «обновляемое представление» применимо и к объектным представлениям. Есть несколько характеристик, которым должны удовлетворять представления для того, чтобы они были обновляемыми (для того чтобы к ним напрямую можно было применять команды DML). Если же представления не являются обновляемыми, а применять команды DML нужно, используются INSTEAD OF триггеры.
Построим таблицу виртуальных объектов типа MANAGER_TYP по исходным данным, хранящимся в MANAGERS:
Примечание: далее подразумевается, что таблица MANAGERS имеет следующую структуру:
MAN_ID NUMBER NOT NULL PARENT KEY,
D_ID NUMBER,
NAME VARCHAR2(30),
HIRE_DAY DATE,
PROCENT NUMBER(4,2),
COMMENTS VARCHAR2(50),
PARENT_ID NUMBER,
DEP_ID NUMBER
CREATE OR REPLACE VIEW managers_ov OF manager_typ
WITH OBJECT IDENTIFIER (Man_id) AS
SELECT m.Man_id, m.D_Id, m.Name, m.Hire_Day, m.Procent, m.Comments, m.Parent_id, m.Dep_Id FROM Managers m;
Доступ к объектам, находящимся в объектных представлениях ничем не отличается от доступа к объектам, находящимся в объектных таблицах:
SELECT m.Name, m.DaysAtCompany() FROM managers_ov m;
UPDATE managers_ov m SET m.Name = INITCAP(m.Name)
WHERE m.Man_id = 1;
SELECT Name FROM managers_ov;
Возможность выполнения традиционных DML-операторов над базовыми таблицами, естественно, сохраняется:
UPDATE Managers SET Name = UPPER(Name) WHERE Man_id = 1;
SELECT Name FROM Managers;