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

— удаляем адрес, указанный в p_address_num

v_add resses.DELETE(p_address_num);

display_addresses(v_addresses);

END delete_address;

В следующем примере вызывается delete_address(2), чтобы удалить адрес

№2 для покупателя № 1 :

□ CALL collection_method_examples.delete_address(2);

Number of addresses = 2

Current number of addresses = 2

Address #1:

2 State Street, Beantown, MA, 12345

Коллекции 469

Address #2:

4 Hill Street, Lost Town, CA, 54321

Deleting address #2

Current number of addresses = 1

Address #1:

2 State Street, Beantown, MA, 12345

Использование EXISTS()

Метод EXISTS(n) возвращает истину, если n-й элемент существует в коллекции:

EXISTS возвращает true для непустых элементов и false для пустых элементов

вложенных таблиц или элементов за границами диапазона коллекции.

Например, у вас есть вложенная таблица по имени v_nested_table,

элементы которой установлены так, как показано в следующей таблице.

Номер элемента Пустой/Непустой

1 Пустой

2 Непустой

3 Пустой

4 Непустой

В этой конфигурации v_nested_table.EXISTS(2) возвращает true (так как

элемент №2 непустой), a v_nested_table. EXISTS(3) возвращает false (так как

элемент №3 пустой).

Следующая процедура exist_addresses() получает адрес покупателя

№1, использует DELETE для удаления адреса №1, а затем использует EXISTS

для проверки того, существуют ли адреса №1 и №2 (Адрес №1 не существует,

поскольку он был удалён, а адрес №2 существует):

□ PROCEDURE exist_addresses IS

v_add resses t_nested_table_add ress;

BEGIN

v_addresses := get_addresses(1 );

DBMS_OUTPUT.PUT_LINE(‘ Deleting address #1’ );

v_addresses.DELETE(1);

-- используем EXISTS для проверки того, существуют ли адреса

IF v_addresses.EXISTS(1) THEN

DBMS_OUTPUT.PUT_LINE('Address #1 does e x is t ');

ELSE

DBMS_OUTPUT.PUT_LINE('Address #1 does not e x is t ');

END IF;

IF v_addresses.EXISTS(2) THEN

DBMS_OUTPUT.PUT_LINE('Address #2 does e x is t ');

END IF;

END exist_addresses;

Следующий пример вызывает exist_addresses():

□ CALL collection_method_examples.exist_addresses();

Number of addresses = 2

Deleting address #1

470 Глава 13

Address #1 does not exist

Address #2 does exist

Использование E X T E N D ()

Метод EXTEND добавляет элементы в конец коллекции. Есть три формы

EXTEND:

■ EXTEND добавляет один элемент, который устанавливается в null;

■ EXTEND(n) добавляет п элементов, которые устанавливаются в null;

■ EXTEND(n, m) добавляет п элементов, которые устанавливаются в копию

элемента т .

Например, у вас есть коллекция v_nested_table, состоящая из семи элементов.

Тогда v_nested_table. EXTEND(2, 5) добавит элемент №5 дважды в

конец коллекции.

Следующая процедура extend_addresses() получает адрес покупателя

№1 в v_addresses, а затем использует EXTEND для того, чтобы скопировать

адрес №1 дважды в конец v_addresses:

П PROCEDURE extend_addresses IS

v_addresses t_nested_table_address;

BEGIN

v_addresses := get_addresses(1 );

display_addresses(v_addresses);

DBMS_OUTPUT.PUT_LINE(‘ Extending addresses’ );

— копируем адрес №1 дважды в конец v_addresses

v_addresses.EXTEND(2, 1);

display_addresses(v_addresses);

END extend_addresses;

В следующем примере вызывается extend_addresses():

□ CALL collection_method_examples.extend_addresses();

Number of addresses = 2

Current number of addresses = 2

Address #1:

2 State Street, Beantown, MA, 12345

Address #2:

4 H ill Street, Lost town, CA, 54321

Extending addresses

Current number of addresses = 4

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

Address #4:

2 State Street, Beantown, MA, 12345

Коллекции 471

Использование F IRST()

Метод FIRST возвращает индекс первого элемента коллекции. Если коллекция

пуста, FIRST возвратит пустое значение (null). Поскольку вложенная

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

FIRST возвращает наименьший индекс непустого элемента во вложенной

таблице. Например, у вас есть вложенная таблица по имени v_nested_

table, элементы которой установлены так, как показано в следующей

таблице.

Номер элемента Пустой/Непустой

1 Пустой

2 Непустой

3 Пустой

4 Непустой

В этой конфигурации v_nested_table. FIRST вернёт 2, наименьший индекс,

содержащий непустой элемент.

Приведенная ниже процедура f i rst_add ress() получает адреса для покупателя

№1 в v_addresses и затем использует FIRST для отображения индекса

первого адреса в v_addresses. Затем процедура удаляет адрес №1 при

помощи DELETE и отображает новый индекс, возвращаемый FIRST:

□ PROCEDURE first_address IS

v_add resses t_nested_table_address;

BEGIN

v_addresses := get_addresses(1 );

- - отображаем первый адрес

DBMS_OUTPUT.PUT_LINE(‘ First address = ‘ || v_addresses.FIRST);

DBMS_OUTPUT.PUT_LINE(' Deleting address #1’ );

v_add resses.DELETE(1);

— снова отображаем первый адрес

DBMS_OUTPUT.PUT_LINE(' First address = ' || v_addresses.FIRST);

END first_address;

В следующем примере вызывается f i rst_add ress():

□ CALL collection_method_examples.first_address();