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

454 Глава 13

пользователем, то TABLE ( ) вернула бы объекты этого типа и COLUMN_VALUE

не появился бы. В следующем разделе вы увидите пример этого.

Вы также можете ввнедрить всё выражение SELECT целиком внутри

TABLE ( ) . Например, следующий запрос перезаписывает предыдущий пример,

помещая SELECT внутри TABLE ():

□ SELECT *

FROM TABLE(

— получить адреса для покупателя №1

SELECT addresses

FROM customers_with_vaг ray

WHERE id = 1

);

COLUMN_VALUE

2 State Street, Beantown, MA, 12345

4 H ill Street, Lost Town, CA, 54321

Следующий запрос показывает другой пример, который использует

TABLE ( ) для получения адресов:

□ SELECT с . id, с . first_name, c.last_name, а.*

FROM customers_with_varray с, TABLE(c.addresses) a

WHERE id = 1;

ID FIRST_NAME LAST_NAME

COLUMN_VALUE

1 Steve Brown

2 State Street, Beantown, MA, 12345

1 Steve Brown

4 Hill Street, Lost Town, CA, 54321

Использование TABLE() со вложенной таблицей

Следующий запрос использует TABLE () для получения двух адресов покупателя

№1 из таблицы customers_with_nested_table. Обратите внимание,

что возвращаются две отдельные строки:

□ SELECT а. *

FROM customers_with_nested_table с, TABLE(c.addresses) а

WHERE id = 1;

STREET CITY ST ZIP

2 State Street Beantown MA 12345

4 H ill Street Lost Town CA 54321

Следующий запрос получает атрибуты адресов street и state:

П SELECT a.street, a.state

FROM customers_with_nested_table с, TABLE(c.addresses) a

Коллекции 455

WHERE id = 1;

STREET ST

2 State Street MA

4 Hill Street CA

Следующий запрос показывает другой пример, который использует

TABLE () для получения адресов:

□ SELECT с . id, с. first_name,. с. last_name, а.*

FROM customers_with_nested_table с, TABLE(c.addresses) а

WHERE с . id = 1;

ID FIRST_NAME LAST_NAME STREET CITY ST ZIP

1 Steve Brown 2 State Street Beantown MA 12345

1 Steve Brown 4 Hill Street Lost Town CA 54321

В следующем далее разделе “Изменение элементов вложенной таблицы”

вы увидите ещё одно важное применение TABLE ().

Изменение элементов коллекций

В этом разделе вы увидите, как модифицировать элементы в varray и во

вложенной таблице. Спокойно запускайте выражения UPDATE, INSERT и

DELETE, которые показаны в этом разделе.

Модификация элементов массива переменной длины

Элементы массива переменной длины можно модифицировать только как

единое целое. Это означает, что даже если нужно изменить значение только

одного какого-то элемента массива, тем не менее, надо предоставить

значения всех элементов массива переменной длины. Следующий оператор

UPDATE модифицирует адреса пользователя № 2 в таблице customers_

with_varray:

□ UPDATE customers_with_varray

SET addresses = t_varray_address(

‘ 6 Any Street, Lost Town, GA, 33347’ ,

‘ 3 New Street, Anytown, MI, 54323’ ,

‘ 7 Market Street, Main Town, MA, 54323’

) WHERE id =

2;

1 row updated.

Модификация элементов вложенных таблиц

В отличие от массивов переменной длины, элементы вложенных таблиц

могут быть модифицированы индивидуально; можно вставлять, модифицировать

или удалять элементы вложенных таблиц. В этом разделе вы увидите,

как выполнять все три операции.

456 Глава 13

Следующее выражение INSERT добавляет адрес для покупателя №2 в

customers_with_nested_table. Обратите внимание, что TABLEO используется

для получения адресов как последовательности строк:

□ INSERT INTO TABLE (

-- получим адреса для покупателя №2

SELECT addresses

FROM customers_with_nested_table

WHERE id = 2

) VALUES (

t_address ('5 Main Street', 'Uptown', 'NY', '55512')

);

1 row created.

Следующее выражение UPDATE меняет адрес покупателя №1 1 High

Street’ на ‘9 Any Street’ . Обратите внимание на использование псевдонима

addr в выражениях VALUE при указании адресов:

□ UPDATE TABLE (

— получим адреса для покупателя №2

SELECT addresses

FROM customers_with_nested_table

WHERE id = 2

) addr

SET VALUE(aDDr) =

t_address('9 Any Street', 'Lost Town', 'VA', '74321')

WHERE VALUE(aDDr) =

t_address(’ 1 High Street’ , 'Newtown , CA , 12347 ),

1 row updated.

Следующее выражение DELETE удаляет адрес '3 New Street...' у покупателя

№2:

□ DELETE FROM TABLE (

— получим адреса для покупателя №2

SELECT addresses

FROM customers_with_nested_table

WHERE id = 1

) addr

WHERE id = 2

) addr

WHERE VALUE(aDDr) =

t_address(’ 3 New Street', ’Anytown', 'M I', '54323');

1 row deleted

Коллекции 457

Использование метода отображения для сравнения

содержимого вложенных таблиц

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

другой вложенной таблицы. Две вложенные таблицы равны, только

если:

■ они являются одного типа;

■ они имеют одинаковое число строк;

■ все их элементы содержат одинаковые значения.

Если элементы вложенной таблицы представляют собой встроенные

типы базы данных, например, NUMBER, VARCHAR2 и т.п., то база данных автоматически

сравнит для вас содержимое двух вложенных таблиц. Однако,