3 James Red
T_VARRAY_ADDRESS ( ‘ 10 Main Street, Green Town, CA, 22212’ ,
‘ 20 State Street, Blue Town, FL, 22213’ )
Манипулирование вложенными таблицами
В этом разделе рассматривается пакет nested_table_package, содержащий
следующие элементы:
■ тип REF CURSOR по имени t_ref_cursor;
■ функцию get_customers(), которая возвращает объект t_ref_cursor,
указывающий на строки из таблицы cstomers_with_nested_table;
■ процедуру insert_customer(), добавляющую новую строку в таблицу
customers_with_nested_table.
В сценарии collection_schema. sql содержатся следующие спецификация
и тело пакета для nested_table_package:
□ CREATE PACKAGE nested_table_package AS
TYPE t_ref_cursor IS REF CURSOR;
FUNCTION get_customers RETURN t_ref_cursor;
PROCEDURE insert_customer (
p_id IN customers_with_nested_table.id%TYPE,
p_first_name IN customers_with_nested_table.first_name%TYPE,
p_last_name IN customers_with_nested_table.last_name%TYPE,
p_addresses IN customers_with_nested_table.addresses%TYPE
); END nested_table_package;
/
CREATE PACKAGE BODY nested_table_package AS
— функция get_customers() возвращает REF CURSOR,
— который указывает на строки в customers_with_nested_table
FUNCTION get_customers
RETURN t_ref_cursor IS
464 Глава 13
— объявление объекта REF CURSOR
v_customers_ref_cursor t_ref_cursor;
BEGIN
— получить REF CURSOR
OPEN v_customers_ref_cursor FOR
SELECT *
FROM customers_with_nested_table;
— вернуть REF CURSOR
RETURN customers_ref_cursor;
END get_customers;
-- процедура insert_customer() добавляет строку в
— customers_with_nested_table
PROCEDURE insert_customer (
p_id IN customers_with_nested_table.id%TYPE,
p_first_name IN customers_with_nested_table.first_name%TYPE,
p_last_name IN customers_with_nested_table.last_name%TYPE,
p_addresses IN custome/s_~with_nested_table.addresses%TYPE
) IS
BEGIN
INSERT INTO customers_with_nested_table
VALUES (p_id, p_first_name, p_last_name, p_addresses);
COMMIT;
EXCEPTION
WHEN OTHERS THEN
ROLLBACK;
END insert_customer;
END nested_table_package;
/
В следующем примере вызывается insert_customer(), чтобы добавить
новую строку в таблицу customers_with_nested_table:
□ CALL nested_table_package. inse rt_custome r(
3, 1 James’ , ' Red’ ,
t_nested_table_address(
t_address(‘ 10 Main Street’ , ‘ Green Town’ , ‘ CA’ , ‘ 22212’ ),
t_address(‘ 20 State Street’ , ‘ Blue Town’ , ‘ FL’ , ‘ 22213’ )
))
;C
all completed.
В следующем примере вызывается get_customers() для выборки строк
из таблицы customers_with_nested_table:
□ SELECT nested_table_package.get_custome rs
FROM dual;
GET_CUST0MERS
CURSOR STATEMENT : 1
CURSOR STATEMENT : 1
Коллекции 465
ID FIRST_NAME LAST_NAME
ADDRESSES(STREET, CITY, STATE, ZIP)
1 Steve Brown
T_NESTED_TABLE_Address(
T_ADDRESS(‘ 2 State Street’ , ‘ Beantown’ , ’MA', ‘ 12345’ ),
T_ADDRESS(‘ 4 Hill Street’ , ‘ Lost Town’ , ‘ CA’ , ‘ 54321’ ) )
2 John Smith
T_NESTED_TABLE_Address(
T_ADDRESS(‘ 1 High Street’ , ‘ Newtown’ , ‘ CA’ , ‘ 12347’ ),
T_ADDRESS(‘ 3 New Street’ , ‘ Anytown’ , ‘ MI’ , '54323'),
T_ADDRESS(‘ 7 Market Street’ , ‘ Main Town’ , ‘ MA’ , ‘ 54323’ ) )
3 James Red
T_NESTED_TABLE_Address(
T_ADDRESS('10 Main Street’ , ‘ Green Town’ , ‘ CA’ , ‘ 22212’ ),
T_ADDRESS('20 State Street’ , ‘ Blue Town’ , ' FL’ , ’ 22213’ ))
Методы коллекций PL/SQL
В этом разделе показаны методы PL/SQL, которые можно использовать с
коллекциями. В таблице 13.3 перечислены методы коллекций. Эти методы
могут быть использованы только в PL/SQL.
Последующие разделы используют пакет по имени collection_method_
examples; примеры демонстрируют использование методов, показанных
в таблице 13.3. Пакет создаётся сценарием collection_schema.sql и в еле-
дующих разделах вы увидите каждый из методов, определённых в этом
пакете.
Использование C O U N T ()
Метод COUNT возвращает количество элементов в коллекции. Поскольку
вложенная таблица может иметь индивидуальные элементы, которые являются
пустыми, COUNT возвращает количество непустых элементов во
вложенной таблице. Например, у вас есть вложенная таблица по имени
v_nested_table, в которой элементы установлены так, как показано в таблице:
Номер элемента Пустой/Непустой
1 Пустой
2 Непустой
3 Пустой
4 Непустой
Таблица 13.3. Методы коллекций PL/SQL
Метод Описание
COUNT Возвращает количество элементов в коллекции. Поскольку вложенная таблица
может иметь индивидуальные элементы, которые являются пустыми,
COUNT возвращает количество непустых элементов во вложенной таблице.
DELETE Удаляет элементы из коллекции. Есть три формы DELETE:
466 Глава 13
Таблица 13.3. Методы коллекций PL/SQL (окончание)
Метод Описание
DELETE(n)
DELETE(n, m)
■ DELETE удаляет все элементы.
■ DELETE(n) удаляет n-й элемент.
■ DELETE(n, m) удаляет элементы с п по т .
Так как массивы переменной длины всегда имеют последовательные индексы,
нельзя удалить отдельные элементы из varray (за исключением элементов
в конце при помощи TRIM).
Возвращает истину, если n-й элемент существует в коллекции: EXISTS
возвращает true для непустых элементов и false для пустых элементов вложенных
таблиц или элементов за границами диапазона коллекции.