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 проверки, может ли объект