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

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 для пустых элементов вложенных

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