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

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

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

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

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

элемента т .

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

FIRST возвратит пустое значение (NULL). Поскольку вложенная таблица может

иметь отдельные элементы, которые являются пустыми, first возвращает

наименьший индекс непустого элемента во вложенной таблице.

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

LAST возвратит пустое значение (NULL). Поскольку вложенная таблица может

иметь отдельные элементы, которые являются пустыми, LAST возвращает

наибольший индекс непустого элемента во вложенной таблице.

Для вложенных таблиц, которые не имеют объявленного размера, LIMIT

возвращает NULL. Для массивов переменной длины LIMIT возвращает

максимальное число элементов, которые может содержать varray. Лимит

указывается в определении типа. Лимит изменяется при использовании

TRIM или EXTEND, а так же при использовании ALTER TABLE для изменения

лимита.

Возвращает индекс элемента, следующего за п. Поскольку вложенная таблица

может иметь отдельные элементы, являющиеся пустыми, next возвращает

индекс непустого элемента после п. Если после л элементы отсутствуют,

next возвратит пустое значение.

Возвращает индекс элемента, предшествующего п. Поскольку вложенная

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

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

PRIOR возвратит пустое значение.

Удаляет элементы с конца коллекции. Есть две формы TRIM:

■ TRIM удаляет один элемент с конца коллекции.

_______________ ■ TRIM(n) удаляет п элементов с конца коллекции.____________________

В этой конфигурации v_nested_table. COUNT возвращает 2, количество

непустых элементов.

EXISTS(n)

EXTEND

EXTEND(n)

EXTEND(n, m)

FIRST

LAST

LIMIT

NEXT(n)

PRIOR(n)

TRIM

TRIM(n)

Коллекции 467

Метод COUNT используется в методах get_addresses() и display.

addresses() пакета collection_method_examples. Функция get_addresses()

возвращает адреса указанного покупателя из customers_with_nested_table,

чей id передан в функцию:

□ FUNCTION get_addresses(

p_id customers_with_nested_table.id%TYPE

) RETURN t_nested_table_address IS

— объявляем объект по имени v.addresses для хранения

-- вложенной таблицы адресов

v_addresses t.nested_table_add ress;

BEGIN

— получим вложенную таблицу адресов в v_addresses

SELECT addresses

INTO v_address

FROM customers_with_nested_table

WHERE id = p_id;

— выводим количество адресов при помощи v.addresses.COUNT

DBMS.OUTPUT.PUT_LINE(

'Number of addresses = ' || v_addresses.COUNT

);

RETURN v_addresses;

END get.addresses;

В следующем примере включается вывод с сервера и вызывается get_

addresses() для покупателя № 1 :

□ SET SERVEROUTPUT ON

SELECT collection_method_examples.get_addresses(1) addresses

FROM dual;

ADDRESSES(STREET, CITY, STATE, ZIP)

T_NESTED_TABLE_ADDRESS(

T_ADDRESS('2 State Street’ , ‘ Beantown’ , ‘ MA’ , ‘ 12345’ ),

T_ADDRESS(‘ 4 Hill Street', ‘ Lost Town’ , ‘ CA’ , ‘ 54321’ ) )

Number of addresses = 2

Приведенная ниже процедура display_addresses() принимает параметр

p_add resses типа t_nested_table_address, содержащий список адресов;

выводит количество адресов в p_add resses, используя COUNT, и использует

цикл для вывода адресов:

□ PROCEDURE display_addresses(

p.addresses t_nested_table_address

) IS

v.count INTEGER;

BEGIN

-- выводим количество адресов в p_addresses

468 Глава 13

DBMS_OUTPUT.PUT_LINE(

'Current number of addresses = ' || p_addresses.COUNT

);

— выводим адреса из p_addresses при помощи цикла

FOR v_count IN 1 . . p_addresses.COUNT LOOP

DBMS_OUTPUT.PUT_LINE('Address #' || v_count ||

DBMS_OUTPUT.PUT(p_addresses.(v_count). street ||

DBMS_OUTPUT.PUT(p_addresses.(v_count).c ity ||

DBMS_OUTPUT.PUT(p_addresses.(v_count).state ||

DBMS_OUTPUT.PUT_LINE (p_addresses.(v_count). z ip ) ;

END LOOP;

END display_addresses;

Вскоре вы увидите пример использования display_addresses().

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

DELETE удаляет элементы из коллекции. Есть три формы DELETE:

■ DELETE удаляет все элементы;

■ DELETE(n) удаляет n-й элемент;

■ DELETE(n, m) удаляет элементы с п по т .

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

элементами, то v_nested_table.DELETE(2, 5) удалит элементы с 2 по 5.

Следующая процедура delete_address() принимает адрес покупателя

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

p_address_num:

□ PROCEDURE delete_address(

p_address_num INTEGER

) IS

v_add resses t_nested_table_add ress;

BEGIN

v_addresses := get_addresses(1 );

display_addresses(v_addresses);

DBMS_OUTPUT.PUT_LINE(‘ Deleting address #’ || p_address_num);