некоторого подтипа быть использован как объект супертипа; если это так,
то 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 не знает о существовании