Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объекты в ORACLE.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
143.87 Кб
Скачать

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;

15