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 и т.п., то база данных автоматически
сравнит для вас содержимое двух вложенных таблиц. Однако,