Добавляет элементы в конец коллекции. Есть три формы 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);