— удаляем адрес, указанный в 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();