— следующего перед адресом №1 ( е г о не с уще с тву ет ,
- - поэтому получаем n u l l ) .
DBMS_OUTPUT.PUT_LINE( '
' v_addresses.PRIOR(1) = ' II v_addresses.PRI0R(1)
); END prior_address;
В следующем примере вызывается prior_address(); v_addresses.PRI0R(1)
равно NULL, поэтому для этого элемента ничего не выводится после знака
равенства:
П CALL collection_method_examples.prior_address();
Number of addresses = 2
v_addresses.PRI0R(2) = 1
v_addresses.PRIOR(1) =
Использование T R IM ()
Метод TRIM удаляет элементы с конца коллекции. Есть две формы TRIM:
■ TRIM удаляет один элемент с конца коллекции;
■ TRIM( п) удаляет п элементов с конца коллекции.
Например, у вас есть вложенная таблица по имени v_nested_table, тогда
v_nested_table. TRIM(2) удалит два элемента с её конца.
Следующая процедура t rim_add resses() получает адрес покупателя №1,
копирует адрес №1 в конец v_addresses трижды при помощи EXTEND(3, 1),
а затем удаляет два адреса из конца v_add resses при помощи TRIM(2):
□ PROCEDURE trim_addresses IS
v_addresses t_nested_table_address;
BEGIN
v_addresses := get_addresses(1 );
display_addresses(v_addresses);
DBMSJDUTPUT.PUT_LINE(‘ Extending addresses’ );
Коллекции 475
v_addresses.EXTEND(3, 1);
display_addresses(v_addresses);
DBMS_OUTPUT.PUT_LINE(‘ Trimming 2 addresses from end’ );
— удалим два адреса с конца v_addresses
-- при помощи TRIM(2)
v_addresses.TRIM(2);
display_add resses(v_add resses);
END trim_addresses;
В следующем примере вызывается trim_addresses():
□ CALL collection_method_examples.trim_addresses();
Number of addresses = 2
Current number of addresses = 2
Address #1:
2 State Street, Beantown, MA, 12345
Address #2:
4 Hill Street, Lost Town, CA, 54321
Extending addresses
Current number of addresses = 5
Address #1: '
2 State Street, Beantown, MA, 12345
Address #2:
4 H ill Street, Lost Town, CA, 54321
Address #3:
2 State Street, Beantown, MA, 12345
Address #4:
2 State Street, Beantown, MA, 12345
Address #5:
2 State Street, Beantown, MA, 12345
Trimming 2 addresses from end
Current number of addresses = 3
Address #1:
2 State Street, Beantown, MA, 12345
Address #2:
4 Hill Street, Lost town, CA, 54321
Address #3:
2 State Street, Beantown, MA, 12345
Многоуровневые коллекции
Начиная с версии базы данных Oracle9i, можно создавать в базе данных
коллекции, элементы которых сами являются коллекциями; эта ситуация
известна как многоуровневые коллекции. В приведенном ниже списке показаны
допустимые типы многоуровневых коллекций.
■ Вложенная таблица, содержащая вложенные таблицы;
■ Вложенная таблица, содержащая массивы переменной длины;
■ Массив переменной длины, содержащий массивы переменной длины;
■ Массив переменной длины, содержащий вложенные таблицы.
476 Глава 13
В каталоге SQL есть сценарий SQL*Plus, который называется co lle c tion
schema_2 .sql и который создает пользователя collection_user2 с паролем
collection_password, а также типы и таблицы, используемые в этом разделе.
Можно выполнить этот сценарий, если использовать в своей работе
базу данных Oracle9i или более поздней версии. После того, как сценарий
будет выполнен, вы будете загружены под пользователем collection_user2 .
Предположим, что необходимо хранить набор телефонных номеров,
связанных с каждым из адресов покупателя. В следующем примере для
представления этих телефонных номеров создается тип массива переменной
длины, состоящий из трех строк VARCHAR2, который называется t_
varray_phone:
□ CREATE TYPE t_varray_phone AS VARRAY(3) OF VARCHAR2(14);
В следующем примере создается объектный тип t.add ress, содержащий
атрибут phone_numbers; этот атрибут определяется с использованием t_
varray_phone:
□ CREATE TYPE t_address AS OBJECT (
street VARCHAR2(15),
c ity VARCHAR2(15), - '
state CHAR(2),
zip VARCHAR2(5),
phone.numbers t_varray_phone
);
В следующем примере создается тип вложенной таблицы из объектов
t_address:
□ CREATE TYPE t_nested_table_address AS TABLE OF t_address;
В следующем примере создается таблица customers_with_nested_table,
содержащая столбец add resses типа t_nested_table_add ress:
□ CREATE TABLE customers.with.nested.table (
id INTEGER PRIMARY KEY,
first.name VARCHAR2(10),
last_name VARCHAR2(10),
addresses t_nested_table_address
) NESTED TABLE
addresses
STORED AS
nested_addresses;
Таким образом, customers.with.nested.table содержит вложенную таблицу,
элементы которой содержат адрес с массивом переменной длины
телефонных номеров.
Следующее выражение INSERT добавляет строку в таблицу customers,
with.nested.table. Обратите внимание на структуру и содержимое оператора
INSERT, который содержит элементы для вложенной таблицы адресов,
каждый из которых имеет встроенный массив переменной длины телефонных
номеров:
Коллекции 477
□ INSERT INTO customers_with_nested_table VALUES (
1 , ‘ Steve’ , ‘ Brown’ ,
t_nested_table_add ress(
t_address('2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ ,
t_varray_phone(
‘ (800)—555-1211’ ,
' (800)-555-1212’ ,
‘ (800)—555—1213’