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

)

),

t_address(‘ 4 Hill Street’ , 'Lost Town’ , ‘ CA’ , ‘ 54321’ ,

t_varray_phone(

‘ (800)—555—1211 ’ ,

' (800)-555-1212’

)

)

))

;

Вы видите, что первый адрес содержит три телефонных номера, а второй

- только два. Следующий запрос получает строки из customers_with_

nested_table:

П SELECT *

FROM custorners_with_nested_table;

ID FIRST_NAME LAST_NAME

ADDRESSES(STREET, CITY, STATE, ZIP, PHONE NUMBERS)

1 Steve Brown

T_NESTED_TABLE_Address(

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

T_VARRAY_PH0NE('(800)-555-1211’ , '(800)-555-1212’ , ‘ (800)-555-1213’ )),

T_ADDRESS('4 Hill Street’ , ‘ Lost Town’ , ‘ CA’ , ‘ 54321’ ,

T_VARRAY_PH0NE(‘ (800)-555-1211’ , ‘ (800)-555-1212’ ) ) ) '

Вы можете использовать TABLE ( ) для работы с данными, которые хранятся

в коллекциях, как с последовательностями строк, как показано в следующем

запросе:

□ SELECT cn.first_name, cn.last_name, a.street, a.city, a.state, р.*

FROM customers_with_nested_table cn,

TABLE(cn.addresses) a, TABLE(a.phone_numbers) p;

FIRST_NAME LAST_NAME STREET CITY ST C0LUMN_VALUE

Steve Brown 2 State Street Beantown MA (800)-555-1211

Steve Brown 2 State Street Beantown MA (800)-555—1212

Steve Brown 2 State Street Beantown MA (800)-555-1213

Steve Brown 4 Hill Street Lost Town CA (800)-555-1211

Steve Brown 4 Hill Street Lost Town CA (800)-555-1212

478 Глава 13

Следующее выражение UPDATE показывает, как обновить телефонные

номера для адреса «2 State Street». Обратите внимание, что TABLE ( ) используется

для получения адресов как последовательностей строк, и что

массив переменной длины, содержащий новые телефонные номера, передаётся

в операторе SET:

□ UPDATE TABLE(

— получим адреса для покупателя №1

SELECT on.addresses

FROM customers_with_nested_table on

WHERE cn.id = 1

) addrs

SET addrs.phone_numbers =

t_varray_phone (

' (800)-555-1214’ ,

’ (800)-555-1215‘

) WHERE addrs.street =

'

2

State Street';

1 row updated.

Следующий запрос подтверждает изменения:

□ SELECT cn.first_name, cn.last_name, a.street, a.city, a.state, p.*

FROM customers_with_nested_table cn,

TABLE(cn.addresses) a, TABLE(a.phone_numbers) p;

FIRST_NAME LAST_NAME STREET CITY ST COLUMN_VALUE

Steve Brown 2 State Street Beantown MA (800)—555—1214

Steve Brown 2 State Street Beantown MA (800)—555—1215

Steve Brown 4 Hill Street Lost Town CA (800)-555-1211

Steve Brown 4 Hill Street Lost Town CA (800)-555-1212

Поддержка многоуровневых типов коллекций является достаточно

мощным расширением базы данных Oracle, и вы можете использовать их

в любых дизайнах баз данных, где вы вносите свой вклад в разработку.

Усовершенствования в коллекциях, появившиеся

в Oraclel Од

В этом разделе вы ознакомитесь с усовершенствованиями, появившимися

в коллекциях для базы данных Oracle 10g.

■ Поддержка ассоциативных массивов.

■ Возможность изменять размер или разрядность типа элемента.

■ Возможность увеличения количества элементов в массиве переменной

длины.

■ Возможность использовать столбцы varray во временных таблицах.

■ Возможность использовать другую табличную область для таблицы,

в которой хранятся вложенные таблицы.

Коллекции 479

Различные выражения, создающие объекты, показанные в этом разделе,

содержатся в сценарии collection_schema_3.sql. Этот сценарий создаёт пользователя

collection_user3 с паролем collection_password, а также создаёт типы

коллекций, таблицы и код PL/SQL. Вы можете выполнить этот сценарий,

если используете базу данных Oracle 10g или выше. После того, как сценарий

будет выполнен, вы будете загружены под пользователем collection_user3.

Ассоциативные массивы

Ассоциативным массивом называется набор пар ключей и значений. Можно

получить из массива значение, используя ключ (который может быть

строкой) или целое число, указывающее на положение этого значения в

массиве. Приведенная ниже процедура customers_associative_array() иллюстрирует

применение ассоциативных массивов:

□ CREATE PROCEDURE customers_associative_array AS

определим тип ассоциативного массива по имени t_assoc_array;

-- значение, хранящееся в каждом элементе массива имеет тип NUMBER,

— а индексный ключ для доступа к каждому элементу имеет тип VARCHAR2

TYPE t_assoc_array IS TABLE OF NUMBER INDEX BY VARCHAR2(15);

объявим объект по имени v_v_customer_array типа t_assoc_array;

v- v- customer_array будет использоваться для хранения возраста покупателей

v_v_custome г_а г ray t_assoc_a г ray;

BEGIN

— присвоим значения для v_v_customer_array; ключ VARCHAR2 является

именем покупателя, а значение NUMBER является его возрастом

v_customer_array('Jason') := 32;

v_customer_array('Steve') := 28;

v_customer_array(' Fred') := 43;

v_customer_array('Cynthia') := 27;

выведем значения, которые хранятся в v_customer_array

DBMS_OUTPUT.PUT_LINE(

' v_customer_array[' 'Jason' ’ ] = ' || v_customer_array('Jason')

DBMS_OUTPUT.PUT_LINE(

' v_customer_array[' 'S te v e ''] = ' || v_customer_array('Steve')

DBMS_OUTPUT.PUT_LINE(

' v_customer_array[' ' Fred' ' ] = ' || v_customer_array(' Fred')

DBMS_OUTPUT.PUT_LINE(

A_customer_array[' 'Cynthia'' ] = ' || v_customer_array('Cynthia')

END customers_associative_array;

/