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

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

' Manager’ , ' XYZ Corp’ )

В предыдущем разделе «Использование объектов подтипа вместо объектов

супертипа» вы видели добавление объектов t_person (Jason Bond) и

t_business_person (Steve Edwards) в таблицу ob]ect_customers. В качестве

напоминания, следующий запрос отображает эти объекты:

□ 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’ )

Поскольку тип t_business_person является подтипом t_person, IS OF (t_

person) возвращает true, когда выполняется проверка объекта t_business_

person или объекта t_person. Это проиллюстрировано в следующем запросе,

который получает и Jason Bond, и Steve Edwards при помощи IS OF (t_

person):

□ SELECT VALUE(o)

FROM object_customers о

WHERE VALUE(o) IS OF (t_person);

VALUE(O)(ID, FIRSTJAME, 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-551, ‘ 800-555-1212’ ,

T_ADDRESS(‘ 1 Market Street’ , ‘ Anytown’ , ‘ VA’ , ‘ 12345’ ),

‘ Manager’ , ‘ XYZ Corp’ )

Вы также можете использовать ключевое слово ONLY совместно с IS

OF ( ) для проверки объектов на конкретный тип: IS OF ( ) возвращает

false для объектов другого типа в иерархии. Например, IS OF (ONLY t_

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

person) вернёт true только для объектов THnat_person и вернёт false для

объектов типа t_business_person. Таким образом, вы можете использовать

IS OF (ONLY t_person), чтобы ограничить результат запроса к таблице

object_customers одним только Jason Bond, как показано в следующем

примере:

□ SELECT VALUE(o)

FROM object_customers о

WHERE VALUE(o) IS OF (ONLY t_person);

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’ ) )

Аналогично, IS OF (ONLY t_business_person) возвращает true только для

объектов типа t_ business_person, и возвращает false для объектов типа t_

person. Например, следующий запрос получает только объект t_business_

person и выводится только информация о Steve Edwards:

П SELECT VALUE(o)

FROM object_custoiners о

WHERE VALUE(o) IS OF (ONLY t_business_person);

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

ADDRESS(STREET, CITY, STATE, ZIP

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

T_ADDRESS(‘ 1 Market Street’ , ‘ Anytown’ , ‘ VA’ , ‘ 12345’ ),

‘ Manager' , ' XYZ Corp’ )

Вы можете указать несколько типов после ONLY. Например, IS OF (ONLY

t_person, t_business_person) вернёт true только для объектов t_person и

t_business_person. Следующий запрос демонстрирует это, возвращая, как

и ожидается, Jason Bond и Steve Edwards:

□ SELECT VALUE(o)

FROM object_customers о

WHERE VALUE(o) IS OF (ONLY t_person, t_business_person);

VALUE(0)(ID, FIRSTJIAME, 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’ )

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

процедура по имени check_types() создаёт объекты t_business_person

nt_person и использует IS 0F() для проверки их типов:

428 Глава 12

□ CREATE PROCEDURE check_types 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-1955', '800-555-1211',

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

BEGIN

-- проверяем типы объектов

IF v_business_person IS OF (t_business_person) THEN

DBMSJDUTPUT.PUT_LINE(' v_business_person is of type ' ||

't_business_person');

END IF;

IF v_person IS OF (t_pe_rson) THEN

DBMSJDUTPUT.PUT_LINE(' v_person is of type t_person');

END IF;

IF v_business_person IS OF (t_person) THEN

DBMSJDUTPUT.PUT_LINE(' v_business_person is of type t_person');

END IF;

IF v_business_person IS OF (t_business_person, t_person) THEN

DBMS_OUTPUT.PUT_LINE(' v_business_person is of ||

'type t_business_person or t_person');

END IF;

IF v_business_person IS OF (ONLY t_business_person) THEN

DBMS_OUTPUT.PUT_LINE(' v_business_person is of only ' ||

'type t_business_person');

END IF;

IF v_business_person IS OF (ONLY t_person) THEN

DBMS_OUTPUT.PUT_LINE(' v_business_person is of only ' ||

'type t_person' ) ;

ELSE

DBMSJDUTPUT. PUT_LINE(' v_business_person is not of only ' ||

'type t_person');

END IF;

END check_types;

/

Следующий пример демонстрирует результат вызова check_types ():

□ SET SERVEROUTPUT ON

CALL check_types();

v_business_person is of type t_business_person

v_person is of type t_person

v_business_person is of type t_person

v_business_person is of type t_business_person or t_person

v_business_person is of only type t_business_person

v_business_person is not of only type t_person

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

TREATO

Функция TREAT ( ) используется для run-time проверки, может ли объект