поздней версией. После того, как сценарий будет выполнен, вы будете загружены под пользователем
object_user2.
Чтобы новый тип наследовал атрибуты и методы существующего типа,
при его описании следует использовать фразу UNDER. В примере с типом
бизнес_персона, которому присваивается имя t_business_person, фраза
UNDER используется для того, чтобы унаследовать атрибуты из типа t_
person:
□ CREATE TYPE t_business_person UNDER t_person (
t i t l e VARCHAR2(10),
Объекты базы данных 421
company VARCHAR2(20)
);
/
В этом примере t_person известен как супертип (supertype), a t_
business_person принято называть подтипом (subtype). Можно использовать
t_business_person при определении объектов столбцов или объектных
таблиц. Следующий оператор создает объектную таблицу object_
business_customers:
□ CREATE TABLE object_business_customers of t_business_person;
В следующем примере вставляется строка в object_business_customers.
Обратите внимание, что два дополнительных атрибута title и company размещаются
в конце конструктора t_business_person:
□ INSERT INTO object_business_customers VALUES (
t_business_person (1, ‘ John'Brown’ , ‘ 01-FEB-1955’ , ’ 800-555-1211 ’ ,
t_address(‘ 2 State Street’ , Beantown’ , ‘ MA’ , ‘ 12345’ ),
‘MANAGER’ , ‘ XYZ Corp’
))
;
Следующий пример иллюстрирует выборку этой строки:
□ SELECT *
FROM object_business_customers
WHERE id = 1;
ID FIRST_NAME LAST_NAME DOB PHONE
ADDRESS(STREET, CITY, STATE, ZIP)
TITLE COMPANY
1 John Brown 01-FEB-55 800-555-1211
T_ADDRESS(’ 2 State Street’ , ‘ Beantown’ , ‘MA’ , ‘ 12345’ )
Manager
XYZ Corp
Следующий запрос вызывает функцию display_details() для этого объекта:
□ SELECT o.display_details()
FROM object_business_customers о
WHERE id = 1;
0.DISPLAY_DETAILS()
id=1, name=John Brown
Когда вы вызываете метод, база данных сначала ищет этот метод в подтипе;
если метод не найден, то осуществляется поиск в супертипе. Если у
вас есть иерархия типов, база данных будет искать тип вверх по иерархии;
если метод не может быть найден, база данных сообщит об ошибке.
422 Глава 12
Использование объекта подтипа вместо объекта супертипа
В этом разделе вы увидите, как использовать объект подтипа вместо объекта
супертипа; это даёт значительную гибкость при хранении и обработке
связанных типов. В примерах вы увидите, как использовать объект t_
business_person (объект подтипа) вместо объекта t_person (объект супер
типа).
Примеры на SQL
Следующее выражение создаёт таблицу по имени object_customers типа
t_person:
□ CREATE TABLE object_customers OF t_person;
Следующее выражение INSERT добавляет объект t_person в эту таблицу
(имя - Jason Bond):
□ INSERT INTO object_customers VALUES (
t_person(1, ‘ Jason’ , ‘ Bond’ , 03-APR—1965’ , ‘ 800-555-1212 ,
t_address( ‘ 21 New Street!, ‘ Anytown’ , ‘ CA’ , ‘ 12345’ )
)
);
В предыдущем выражении нет ничего необычного: INSERT просто добавляет
объект t_person в таблицу object_custorners. Теперь, поскольку таблица
object_customers хранит объекты типа t_person, и t_person является
супертипом для t_business_person, вы можете сохранить объект t_business_
person в object_customers. Следующее выражение INSERT демонстрирует
это, добавляя покупателя по имени Steve Edwards:
□ INSERT INTO object_customers VALUES (
t_business_person(2, ‘ Steve’ , ‘ Edwards’ , ‘ 03-MAR-1955 , 800 555 1212 ,
t_address(‘ 1 Market Street’ , ‘ Anytown’ , ‘ VA’ , ‘ 12345’ ),
‘ Manager’ , ' XYZ Corp’
)
);
Таблица ob j ect_custome rs теперь содержит два объекта: объект t_pe rson,
который был добавлен ранее (Jason Bond), и новый объект t_business_
person (Steve Edwards). Следующий запрос получает эти два объекта; обратите
внимание, что атрибуты t i t l e и company отсутствуют в выходной
информации для Steve Edwards:
□ SELECT *
FROM object_customers о;
ID FIRSTJJAME LAST_NAME DOB PHONE
ADDRESS(STREET, CITY, STATE, ZIP)
1 Jason Bond 03-APR-65 800-555-1212
T_ADDRESS(‘ 21 New Street’ , ‘ Anytown’ , ‘ CA’ , ‘ 12345’ )
Объекты базы данных 423
2 Steve Edwards 03-MAR-55 800-555-1212
T_ADDRESS('1 Market Street’ , ‘ Anytown’ , ‘ VA’ , ‘ 12345’ )
Вы можете получить полный набор атрибутов для Steve Edwards, используя
VALUE ( ) в запросе, как показано в следующем примере. Обратите
внимание на разные типы объектов для Jason Bond (объект t_ person) и
Steve Edwards (объект t_business_person) и на то, что атрибуты t i t l e и
company для Steve Edwards теперь появились в выходных данных:
□ SELECT VALUE(o) FROM object_customers о;
VALUE(0)(ID, FIRST_NAME, LAST_NAME, DOB, PHONE,
ADDRESS(STREET, CITY, STATE, ZIP
T_PERS0N(1, ‘ Jason’ , ’ Bond’ , ’ 03-APR-65’ , ’ 800-555-1212’ ,
T_ADDRESS(‘ 21 New Street’ , ‘ Anytown’ , ‘ CA’ , ‘ 12345’ ) )
T_BUSINESS_PERS0N(2, ‘ Steve’ , ‘ Edwards’ , ‘ 03-MAR-55’ , ‘ 800-555-1212’ ,
T_ADDRESS(‘ 1 Market Street’ , ‘ Anytown’ , ‘ VA’ , ‘ 12345’ ),
‘ Manager’ , ‘ XYZ Corp’ )
Примеры на PL/SQL
Вы также можете манипулировать объектами субтипов и супертипов в
PL/SQL. Например, следующая процедура по имени subtypes_and_