если элементы представляют собой определённый пользователем объектный
тип, вам нужно будет предоставить функцию отображения, в которой
содержится код для сравнения объектов (функции отображения были показаны
в разделе “Сравнение значений объектов” предыдущей главы).
Следующие выражения создают тип по имени t_address2, который содержит
функцию отображения по имени g e t_ s trin g (). Обратите внимание,
что get_string () возвращает VARCHAR2, содержащий значения атрибутов
zip, state, city, и street:
□ CREATE TYPE t_address2 AS OBJECT (
s t r e e t VARCHAR2(15),
C it y VARCHAR2 (15),
s ta te CHAR(2),
z ip VARCHAR2(5),
— объявим функцию отображения g e t_ s trin g (),
— которая возвращает строку VARCHAR2
MAP MEMBER FUNCTION get _ s tr in g RETURN VARCHAR2
);
/
CREATE TYPE BODY t_address2 AS
- - определим функцию отображения g e t_ s trin g ()
MAP MEMBER FUNCTION g e t_ s trin g RETURN VARCHAR2 IS
BEGIN
- - вернём объединённую строку, содержащую
- - атрибуты z ip , s ta te , c it y , и s t r e e t
RETURN z ip || ' ' || s ta te || ' ' || c it y || ' ' || s tre e t;
END g e t_ s trin g ;
END;
/
Как вы вскоре увидите, база данных будет автоматически вызывать get_
s t r in g ( ) при сравнении объектов t_address2.
Следующие выражения создают тип вложенной таблицы и таблицу, а
также добавляют строку в таблицу:
458 Глава 13
□ CREATE TYPE t_nested_table_address2 AS TABLE OF t_address2;
CREATE TABLE customers_with_nested_table2 (
id INTEGER PRIMARY KEY,
first_name VARCHAR2(10),
last_name VARCHAR2(I0),
addresses t_nested_table_address2
) NESTED TABLE
addresses
STORE AS
nested_ addresses2 ;
INSERT INTO customers_with_nested_table2 VALUES (
1 , ' Steve’ , ' Brown’ ,
t_nested_table_address2(
t_address2('2 State Street’ , ‘ Beantown’ , ’ MA’ , ‘ 12345’ ),
t_address2('4 H ill Street’ , ‘ Lost Town’ , ‘ CA’ , ‘ 54321’ )
))
;
Следующий запрос'включает вложенную таблицу в выражении WHERE.
Обратите внимание, что адреса после знака равенства (=) в выражении
WHERE те же самые, что и в предыдущем выражении INSERT:
□ SELECT on.id, cn.first_name, cn.last_name
FROM customers_with_nested_table2 cn
WHERE cn.addresses =
t_nested_table_add ress2 (
t_address2(‘ 2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ ),
t_address2(‘ 4 Hill Street’ , ‘ Lost Town’ , ‘ CA’ , ‘ 54321’ )
);
ID FIRST_NAME LAST_NAME
1 Steve Brown
При выполнении запроса база данных автоматически вызывает get_
string ( ) для сравнения объектов t_address2 в cn. addresses с объектами
t_address2 после знака равно (=) в операторе WHERE. Функция get_st ring ( )
возвращает строку VARCHAR2, которая содержит атрибуты объектов zip,
state, city, и street, и когда строки будут равны для каждого объекта, то и
вложенные таблицы будут также равны.
Следующий запрос не возвращает строки, потому что только один адрес
после знака равенства в операторе WHERE совпадает с адресом в сп.
add resses (напоминание: две вложенные таблицы равны, только если они
одного типа, имеют одинаковое число строк, и их элементы содержат одинаковые
значения):
□ SELECT cn.id, cn.first_name, cn.last_name
FROM customers_with_nested_table2 cn
WHERE cn.addresses =
Коллекции 459
t_nested_table_add ress2 (
t_address2(‘ 4 H ill Street’ , ‘ Lost Town’ , ’ CA’ , ‘ 54321’ )
);
no rows selected
В базе данных O ra c le lO g и выше вы можете использовать оператор
SUBMULTISET для проверки того, является ли содержимое одной вложенной
таблицы подмножеством другой вложенной таблицы. Следующий запрос
переписывает предыдущий пример и возвращает строку:
□ SELECT cn.id, cn.first_name, cn.last_name
FROM customers_with_nested_table2 cn
WHERE
t_nested_table_address2(
t_address2('4 Hill Street', 'Lost Town', 'CA', '54321')
) SUBMULTISET OF cn.addresses;
ID FIRST_NAME LAST_NAME
1 Steve Brown
Так как адрес в первой части выражения WHERE является подмножеством
адресов в cn. addresses, то обнаруживается совпадение и возвращается
строка.
Следующий запрос демонстрирует другой пример: на этот раз адреса
в cn. addresses являются подмножеством адресов после OF в операторе
WHERE:
□ SELECT cn.id, cn.first_name, cn.last_name
FROM customers_with_nested_table2 cn
WHERE
cn.addresses SUBMULTISET OF
t_nested_table_address2 (
t_address2(‘ 2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ ),
t_address2(‘ 4 Hill Street’ , ‘ Lost Town’ , ‘ CA’ , ‘ 54321’ ),
t_address2( ‘ 6 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ )
);
ID FIRST_NAME LAST_NAME
1 Steve Brown
Позже в этой главе в разделе «Оператор SUBMULTISET” вы узнаете больше
об операторе SUBMULTISET. Также в разделе “Операторы Equal и Not-Equal”
вы увидите, как использовать операторы ANSI, реализованные в базе данных
Oracle 10g, для сравнения вложенных таблиц.
Примечание Не существует прямого механизма для сравнения содержимого массивов переменной
длины.
460 Глава 13
Использование CAST() для преобразования коллекций
из одного типа в другой
Вы можете использовать CAST () для преобразования коллекции из одного