)
),
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;
/