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

— следующего перед адресом №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’