— дополнительных атрибутов t i t l e и company
— DBMS_0UTPUT.PUT_LINE('v_person2.title = ' ||
v_person2 . t i t l e ) ;
— DBMS_0UTPUT.PUT_LINE('v_person2. company = '
— || v_person2 .company);
— используем TREAT при присвоении v_business_person к v_person2
DBMS_0UTPUT.PUT_LINE('Using TREAT') ;
v_person2 := TREAT(v_business_person AS t_person);
432 Глава 12
DBMS_OUTPUT.PUT_LINE(' v_person2.id = ' || v_person2. i d ) ;
DBMS_0UTPUT.PUT_LINE('v_person2.first_name = ' ||
v _pe rson2.firs t_name) ;
DBMS_OUTPUT.PUT_LINE(' v_person2.last_name = 11
v_person2.last_name);
— следующие строки по-прежнему не будут компилироваться, так как v_
person2
- - имеет тип t_person, и t_person не знает о
— дополнительных атрибутах t i t l e и company
— DBMS_0UTPUT.PUT_LINE('v_person2.title = ' II
— v _ p e r s o n 2 . t i t le ) ;
— DBMSJDUTPUT.PUT_LINE(' v_person2.company = ’ I I
— v_person2.company);
— следующие строки компилируются, потому что используется TREAT
DBMS_OUTPUT.PUT_LINE(' v _ p e r s o n 2 . t it le = ' ||
TREAT(v_person2 AS t_bus ines s_person) . t i t l e ) ;
DBMS_OUTPUT.PUT_LINE(' v_person2.company = ' ||
TREAT(v_person2 AS t_bus ines s_person) . company);
- - следующая строка не будет компилироваться, поскольку вы не можете
- - напрямую присваивать объект t_person к объекту t_business_person
- - v_business_person2 := v_person;
— следующая строка вызывает ошибку runtime, потому что вы не можете
- - присваивать объект супертипа (v_person) объекту подтипа
- - (v_business_person2)
— v_business_person2 := TREAT(v_person AS t_bus ines s_person) ;
END treat_example;
Следующий пример показывает результат вызова treat_example ():
□ SET SERVEROUTPUT ON
CALL treat_example();
v_person2.id = 1
v_person2.first_name = John
v_person2.last_name = Brown
Using TREAT
v_person2.id = 1
v_person2.first_name = John
v_person2.last_name = Brown
v_person2. t i t l e = Manager
v_person2.company = XYZ Corp
SYS_TYPEID()
Функция SYS_TYPEID () используется для получения идентификатора типа
объекта. Например, следующий запрос использует SYS_TYPEID() для получения
идентификатора типа объекта в таблице object_business_customers:
□ SELECT first_name, last_name, SYS_TYPEID(VALUE(o))
FROM object_business_customers o;
FIRST_NAME LAST_NAME SY
John Brown 02
Объекты базы данных 433
Вы можете получить сведения о типах, определённых пользователем,
через представление userjypes. Следующий запрос получает сведения о
типе с typeid, равным ‘02’ (идентификатор, ранее полученный при помощи
SYS_TYPEID ( ) ) и type_name равным T_BUSINESS_PERSON:
□ SELECT typecode, a t t r ib u te s , methods, supertype_name
FROM user_types
WHERE typ e id = ‘ 02’
AND type_name = ' T_BUSINESS_PERSON’ ;
TYPECODE ATTRIBUTES METHODS SUPERTYPE_NAME
OBJECT 8 1 T_PERS0N
Из выходных результатов этого запроса видно, что супертипом для t_
business_person является t_person. Также t_business_person имеет восемь
атрибутов и один метод.
Объектные типы NOT INSTANTIABLE
Можно пометить объектный тип как NOT INSTANTIABLE (нереализуемый),
что препятствует созданию объектов этого типа. Это может оказаться полезным,
если планируется использовать некоторый абстрактный тип только
в качестве супертипа. Например, вы могли бы создать абстрактный тип
t_vehicle и использовать его в качестве супертипа для подтипов t_car и t_
motorcycle; затем вы бы создали реальные объекты t_car и t_motorcycle, но
никогда не стали бы создавать объекты t_vehicle.
Следующее выражение создаёт тип по имени t_vehicle, который помечен
как NOT INSTANTIABLE:
□ CREATE TYPE t_vehicle AS OBJECT (
id INTEGER,
make VARCHAR2(15),
model VARCHAR2(15)
) NOT FINAL NOT INSTANTIABLE;
/
Примечание Объектный тип t_vehicle помечен как not final. Тип not instantiable не может
быть FINAL, так как в подобном случае его нельзя использовать в качестве супертипа.
В следующем примере создается тип t_car, который наследует супертип
t_vehicle. Обратите внимание, что у типа t_car имеется дополнительный
атрибут convertible, в котором отмечается, является ли данный вид автомобиля
автомобилем с откидным верхом (Y или N):
□ CREATE TYPE t_car UNDER t_vehicle (
convertible CHAR(1)
);
/
В следующем примере создается тип t_motorcycle, который наследует
супертип t_vehicle. У типа tjnotorcycle есть дополнительный атрибут
434 Глава 12
sidecar, в котором отмечается, имеет ли данный вид мотоцикла прицеп
ную коляску (Y или N):
□ CREATE TYPE tjnotorcycle UNDER t„vehicle (
sidecar CHAR(1)
);
/
В следующем примере создаются таблицы vehicles, cars и motorcycles,
являющиеся объектными таблицами, которые используют объектные типы
t_vehicle, t_car и t_motorcycle:
□ CREATE TABLE vehicles OF t_vehicle;
CREATE TABLE cars OF t„car;
CREATE TABLE motorcycles OF t„motorcycle;
Поскольку t„v eh ic le является NOT INSTANTIABLE, в таблицу vehicles
нельзя добавлять строки. При попытке сделать это база данных сообщит
об ошибке:
□ SQL> INSERT INTO vehicles values (
2 t_ vehicle(1, ‘ Toyota', TMR2’ , ' 01-FEB-1955’ )
3 );
t_vehicle(1, ‘ Toyota’ , ‘ MR2’ , ‘ 01-FEB-1955 )
*
ERROR at line 2:
ORA-22826: cannot construct an instance of a non instantiable type
(ORA-22826: невозможно создать экземпляр нереализуемого типа)