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

если элементы представляют собой определённый пользователем объектный

тип, вам нужно будет предоставить функцию отображения, в которой

содержится код для сравнения объектов (функции отображения были показаны

в разделе “Сравнение значений объектов” предыдущей главы).

Следующие выражения создают тип по имени 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 () для преобразования коллекции из одного