Выбрать главу

поздней версией. После того, как сценарий будет выполнен, вы будете загружены под пользователем

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_