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

некоторого подтипа быть использован как объект супертипа; если это так,

то TREAT ( ) возвращает объект, если нет, то TREAT ( ) возвращает null. Например,

поскольку t_business_person является подтипом t_person, с объектом

t_business_ person можно обращаться как с объектом t_person; вы уже

видели это ранее в разделе “Использование объектов подтипа вместо объектов

супертипа” , где объект t_business_person (Steve Edwards) был добавлен

в таблицу object_customers, которая хранит объекты t_person. Следующий

запрос использует TREAT ( ) для проверки того, что Steve Edwards можно

использовать как объект t_person:

□ SELECT NVL2(TREAT(VALUE(о) AS t_person), 'yes', 'n o ')

FROM object_oustomers о

WHERE first_name = ‘ Steve’ AND last_name = ‘ Edwards’ ;

NVL

yes

Функция NVL2() возвращает yes, поскольку TR EAT ( VA LU E (o) AS t_person)

возвращает объект (а не значение NULL). Это означает, что Steve Edwards

можно использовать как объект t_person.

Следующий запрос проверяет, может ли Jason Bond (объект типа t_

ре rson) использоваться как объект t_business_person - он не может использоваться,

следовательно, TREAT ( ) возвращает NULL, и NVL2( ) возвращает по:

□ SELECT NVL2(TREAT(VALUE(o) AS t_business_person), 'y e s’ , 'n o ')

FROM object_customers о

WHERE first_name = ‘ Jason’ AND last_name = ‘ Bond’ ;

NVL

no

Поскольку TREAT ( ) возвращает NULL для всего объекта, все индивидуальные

атрибуты объекта также равны NULL. Например, следующий запрос

пытается прочитать атрибут first_name посредством Jason Bond - как и

ожидалось, результат равен NULL:

П SELECT

NVL2(TREAT(VALUE(o) AS t_business_person). first_name, ‘ not null’ ,

' null’ )

FROM object_customers о

WHERE first_name = ‘ Jason’ AND last_naine = ‘ Bond’ ;

NVL2

null

Следующий запрос использует TREAT ( ) для проверки того, может ли

Jason Bond рассматриваться как объект t_pe rson - он и есть объект t_pe rson,

поэтому возвращается yes:

П SELECT NVL2(TREAT(VALUE(o) AS t_person). first_name, 'yes', 'n o ')

FROM object_customers о

430 Глава 12

WHERE first_name = ‘ Jason’ AND last_name = ‘ Bond’ ;

NVL

yes

Вы также можете получить объект при помощи TREAT ( ) ; например, следующий

запрос получает Steve Edwards:

□ SELECT TREAT(VALUE(o) AS t_business_person)

FROM object_customers о

WHERE first_name = ‘Steve’ AND last_name = ‘Edwards’;

TREAT(VALUE(0)AST_BUSINESS_PERS0N)(ID, FIRST_NAME, LAST_NAME, DOB,

PHONE, ADDRESS

T_BUSINESS_PERS0N(2, 'Steve', 'Edwards', '03-MAR-55', '800-555-1212',

T_ADDRESS('1 Market Street', 'Anytown', 'VA', '12345'),

‘ Manager’ , ' XYZ Corp’ )

Если вы запустите этот запрос для Jason Bond, то как и ожидается, получите

NULL; в выходных данцых этого запроса ничего нет:

□ SELECT TREAT(VALUE(o) AS t_business_person)

FROM object_customers о

WHERE first_name = ‘Jason’ AND last_name = 'Bond';

TREAT(VALUE(0)AST_BUSINESS_PERSON)(ID, FIRSTJJAME, LAST_NAME, DOB,

PHONE, ADDRESS

Давайте посмотрим на использование TREAT ( ) с таблицей object_

business_customers, которая содержит объект John Brown типа t_business_

person:

□ SELECT VALUE(o)

FROM object_business_customers o;

VALUE(0)(ID, FIRST_NAME, LAST_NAME, DOB, PHONE,

ADDRESS(STREET, CITY, STATE, ZIP

T_BUSINESS_PERS0N(1, 'John', 'Brown', '01-FEB-55', '800-555-1211',

T_ADDRESS('2 State S t r e e t ', 'Beantown', 'MA', '12345'),

‘ Manager’ , ‘ XYZ Corp’ )

Следующий запрос использует TREAT ( ) для проверки того, что John

Brown может рассматриваться как объект t_person - он может, потому что

t_business_person является подтипом t_person; следовательно, запрос возвращает

yes:

□ SELECT NVL2(TREAT(VALUE(o) AS t_person), 'ye s', 'n o ')

FROM object_business_customers о

WHERE first_name = ‘ John’ AND last_name = ‘ Brown’ ;

NVL

yes

Объекты базы данных 431

Следующий пример показывает объект, возвращаемый TREAT ( ) при обращении

к объектной таблице business_customers. Обратите внимание,

что вы всё ещё получаете атрибуты title и company для John Brown:

□ SELECT TREAT(VALUE(o) AS t_parson)

FROM ob]ect_business_customers o;

TREAT(VALUE(0)AST_PERSON)(ID, FIRST_NAME, LAST_NAME, DOB, PHONE,

ADDRESS(STREET,

T_BUSINESS_PERS0N(1, ‘ John’ , ‘ Brown’ , ‘ 01-FEB-55’ , ‘ 800-555-1211’ ,

T_ADDRESS(‘ 2 State Street’ , ‘ Beantown’ , ‘ MA', ‘ 12345’ ),

' Manager’ , ‘ XYZ Corp’ )

Вы также можете использовать TREAT ( ) в PL/SQL. Например, следующая

процедура по имени treat_ example () иллюстрирует применение TREAT

( ) (чтобы понять, как TREAT ( ) работает в PL/SQL, изучите комментарии

по тексту процедуры):

□ CREATE PROCEDURE treat_example AS

-- создаём объекты _ *

v_business_person t_business_person :=

t_business_person(

1, 'John', 'Brown',

'01-FEB-1955', '800-555-1211',

t_address('2 State Street', 'Beantown', 'MA', '12345'),

'Manager', 'XYZ Corp'

);

v_person t_person :=

t_person(1, 'John', 'Brown', '01-FEB-19551, '800-555-1211',

t_address('2 State S t re e t ', 'Beantown', 'MA', '12345'));

v_business_person2 t_business_person;

v_person2 t_person;

BEGIN

— присвоим v_business_person к v_person2

v_person2 := v_business_person;

DBMS_0UTPUT.PUT_LINE(' v_person2.id = ' || v_person2.id);

DBMS_0UTPUT.PUT_LINE(' v_person2.first_name = ' ||

v_person2 .first_name);

DBMS_0UTPUT.PUT_LINE(' v_person2.last_name - ' ||

v_person2 .last_name);

-- следующие строки не будут компилироваться, потому что v_person2

-- имеет тип t_person, a t_person не знает о существовании