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

Number of addresses = 2

First address = 1

Deleting address #1

First address = 2

Использование LA ST ()

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

пуста, LAST возвратит пустое значение (null). Поскольку вложенная

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

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

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

которой установлены так, как показано в следующей таблице.

472 Глава 13

Номер элемента

1

2

3

4

Пустой/Непустой

Непустой

Пустой

Пустой

Непустой

В этой конфигурации v_nested_table. LAST вернёт 4, наибольший индекс,

содержащий непустой элемент.

Приведенная ниже процедура last_address() получает адреса для покупателя

№1 в v_addresses и затем использует LAST для отображения индекса

последнего адреса в v_add resses; затем процедура удаляет адрес №2 при помощи

DELETE и отображает новый индекс, возвращаемый LAST:

□ PROCEDURE last_address IS

v_addresses t_nested_table_address;

BEGIN

v_addresses := get_addresses(1 );

— выводим последний адрес

DBMS_OUTPUT.PUT_LINE( 1 Last address = ‘ || v_addresses.LAST);

DBMS_OUTPUT.PUT_LINE(‘ Deleting address #2’ );

v_addresses.DELETE(2);

— ещё раз выводим последний адрес

DBMS_OUTPUT.PUT_LINE(' Last address = ' II v_addresses.LAST);

END last_address;

Следующий пример вызывает last_address():

□ CALL collection_method_examples.last_address();

Number of addresses = 2

Last address = 2

Deleting address #2

Last address = 1

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

Метод NEXT(n) возвращает индекс элемента, следующего за п. Поскольку

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

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

отсутствуют, NEXT возвратит пустое значение. Например, у вас есть

вложенная таблица по имени v_nested_table, элементы которой установлены

так, как показано в следующей таблице.

Номер элемента Пустой/Непустой

1 Непустой

2 Пустой

3 Пустой

4 Непустой

В этой конфигурации v_nested_table.NEXT(1) возвращает 4, индекс, содержащий

следующий непустой элемент; v_nested_table. NEXT(4) возвращает

NULL.

Коллекции 473

Приведенная ниже процедура next_address() получает адрес для покупателя

№1 в v_addresses и затем использует NEXT(1) для получения индекса

адреса, следующего в v_add resses за адресом № 1 . Затем процедура использует

NEXT(2) в попытке получить индекс адреса, который следует за адресом

№2 (его не существует, так как покупатель №1 имеет всего два адреса,

поэтому возвращается NULL):

□ PROCEDURE next_address IS

v_add resses t_nested_table_add re s s ;

BEGIN

v_addresses := get_addresses(1);

— используем NEXT(1) чтобы получить индекс адреса,

— который сделует за адресом №1

DBMS_OUTPUT.PUT_LINE(

' v_addresses.NEXT(1) = ’ || v_addresses.NEXT(1)

);

— используем NEXT(2) чтобы получить индекс адреса,

- - который следует за адресом №2 (его не существует,

— поэтому получаем n u ll)

DBMS_OUTPUT.PUT_LINE(

' v_addresses.NEXT(2) = ' || v_addresses.NEXT(2)

);

END next_address;

В следующем примере вызывается next_address(); v_addresses.NEXT(2)

равно NULL, поэтому для этого элемента ничего не выводится после знака

равенства:

П CALL co llection _m eth od_e xam p les.n e xt_ add ress();

Number o f addresses = 2

v _ ad d re sse s.N EXT(1) = 2

v_addresses.NEXT(2) =

Использование P R IO R ()

Метод PRIOR(n) возвращает индекс элемента, предшествующего п. Поскольку

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

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

перед п элементы отсутствуют, PRIOR возвратит пустое значение. Например,

у вас есть вложенная таблица по имени v_nested_table, элементы которой

установлены так, как показано в следующей таблице.

Номер элемента Пустой/Непустой

1 Непустой

2 Пустой

3 Пустой

4 Непустой

В этой конфигурации v_nested_table. PRIOR(4) возвращает 1, индекс, содержащий

предыдущий непустой элемент; v_nested_table. PRI0R( 1) возвращает

NULL.

474 Глава 13

Приведенная ниже процедура prior_address() получает адрес для покупателя

№1 в v_addresses и затем использует PRI0R(2) для получения индекса

адреса, предшествующего в v_addresses адресу №2. Затем процедура

использует PRIOR(1) в попытке получить индекс адреса, который предшествует

адресу №1 (его не существует, поэтому возвращается NULL):

□ PROCEDURE prior_address IS

v_addresses t_nested_table_address;

BEGIN

v_addresses := get_addresses(1 );

— исполь зуем PR I0 R (2 ) , чтобы получить индекс адреса,

— следующего перед адресом №2

DBMS_OUTPUT.PUT_LINE(

' v_addresses.PRIOR(2) = ' || v_addresses.PRI0R(2)

);

— используем PRIOR( 1 ) , чтобы получить индекс адреса,