В следующем примере включается вывод на сервере и вызывается
customers_associative_array():
□ SET SERVEROUTPUT ON
CALL customers_associative_array();
4 8 0 Глава 13
v_customer_array[‘ Jason’ ] = 32
v_customer_array[' Steve’ ] = 28
v_customer_array[‘ Fred'] = 43
v_customer_array[‘ Cynthia’ ] = 27
Изменение размера типа элемента
Можно изменить размер типа элемента в коллекции, если тип элемента
принадлежит к символьным, числовым или бесформатным типам (бесформатные
типы используются для хранения двоичных данных - вы
познакомитесь с ними в следующей главе). Ранее в этой главе был приведен
пример, в котором создается тип массива переменной длины по имени
t_varray_address:
□ CREATE TYPE t_varray_address AS VARRAY(2) OF VARCHAR2(50);
/
В следующем примере изменяется размер элементов VARCHAR2 в t_
varray_address н а 60:
□ ALTER TYPE t_varray_address
MODIFY ELEMENT TYPE VARCHAR2(60) CASCADE;
Type altered.
Опция CASCADE передает изменения во все зависимые объекты в базе
данных. В данном примере зависимым объектом является таблица
customers_with_varray, которая содержит столбец типа t_varray_add ress по
имени addresses. Кроме того, можно использовать опцию INVALIDATE, чтобы
сделать недействительными любые зависимые объекты и немедленно
рекомпилировать код PL/SQL для этого типа.
Увеличение количества элементов массива переменной длины
Число элементов массива переменной длины можно увеличить. В следующем
примере увеличивается число элементов в t_varray_address до 5:
□ ALTER TYPE t_varray_address
MODIFY LIMIT 5 CASCADE;
Type altered.
Использование массивов переменной длины во временных таблицах
Массивы переменной длины можно использовать во временных таблицах,
строки которых являются временными и зависят от сессии пользователя
(временные таблицы были рассмотрены в разделе «Создание таблиц» в
главе 10). В следующем примере создается временная таблица cust_with_
varray_temp_table, содержащая массив переменной длины addresses типа
t_varray_address:
□ CREATE GLOBAL TEMPORARY TABLE cust_with_varray_temp_table (
id INTEGER PRIMARY KEY,
first_name VARCHAR2(10),
last_name VARCHAR2(10),
addresses t_varray_address
);
Коллекции 481
Использование различных табличных пространств для таблицы,
в которой хранятся вложенные таблицы
По умолчанию таблица, в которой хранится вложенная таблица, создается
в том же самом табличном пространстве, что и родительская таблица.
(Табличное пространство - это область, которая используется базой данных
для хранения таких объектов, как таблицы - см. раздел «Создание таблиц
» главы 10.)
В Oracle 10g и выше можно указать для таблицы, в которой хранится
вложенная таблица, другое табличное пространство. В следующем примере
создается таблица cust_with_nested_table, содержащая вложенную таблицу
addresses типа t_nested_table_address. Обратите внимание, что память
для хранения таблицы nested_addresses2 будет выделена в табличном
пространстве users:
□ CREATE TABLE cust_with_nested_table (
id INTEGER PRIMARY KEY,
first_name VARCHAR2(10),
last_name VARCHAR2(10),
addresses t_nested_table_address
) NESTED TABLE
addresses
STORE AS
nested_addresses2 TABLESPACE users;
Чтобы этот пример работал, у вас должно существовать табличное пространство
users. По этой причине этот пример в сценарии collection_
schema3.sql “закомментарен”. Вы можете посмотреть, к каким табличным
пространствам у вас есть доступ, сделав запрос к представлению user_
tablespaces:
□ SELECT tablespace_name
FROM user_tablespaces;
TABLESPACE_NAME
SYSTEM
SYSAUX
UND0TBS1
TEMP
USERS
EXAMPLE
Если вы хотите выполнить предыдущий пример, вы можете отредактировать
эту часть сценария collection_schema3.sql и указать одно из доступных
вам табличных пространств, а затем скопировать пример в SQITPlus и
выполнить его.
Поддержка ANSI для вложенных таблиц
Спецификация Национального института стандартизации США (ANSI)
включает некоторое количество операторов, которые могут быть исполь482
Глава 13
зованы со вложенными таблицами. В следующих разделах вы ознакомитесь
с этими операторами.
Операторы равенства и неравенства
Операторы равенства (=) и неравенства ( о ) используются для сравнения
вложенных таблиц, которые считаются равными при выполнении всех перечисленных
ниже условий:
■ все таблицы имеют один и тот же тип;
■ все таблицы содержат одинаковое число элементов;
■ все элементы равны.
Приведенная ниже процедура equal_example() иллюстрирует применение
операторов равенства и неравенства:
□ CREATE PROCEDURE equal_example AS
— объявим тип по имени t_ n e s te d _ ta b le
TYPE t_ n e s te d _ ta b le IS TABLE OF VARCHAR2(10);
- - создадим объекты типа t_ n e s te d _ ta b le по имени v_customer_nested_