Создание типов коллекций
В этом разделе вы увидите, как создавать тип varray и вложенные таблицы.
Создание типа varray
Массив varray хранит упорядоченный набор элементов, все одного типа, и
их тип может быть встроенным типом базы данных или определённым
пользователем объектным типом. Каждый элемент имеет индекс, который
соответствует его позиции в массиве, и вы можете изменять элементы
в varray только как единое целое.
Тип данных varray создается с помощью оператора CREATE TYPE, в котором
указывается максимальный размер и тип хранящихся в массиве элементов.
Следующий оператор создает массив переменной длины, называемый
t_varray_add ress, в котором можно хранить до двух строк VARCHAR2:
□ CREATE TYPE t_varray_address AS VARRAY(3) OF VARCHAR2(50);
Каждая из строк VARCHAR2 может быть использована для хранения отдельного
адреса покупателя гипотетического магазина. В базе данных Oracle
10g или выше вы можете изменить максимальное число элементов varray
при помощи оператора ALTER TYPE. Например, следующее выражение увеличивает
максимальное число элементов до десяти:
□ ALTER TABLE t_varray_address MODIFY LIMIT 10 CASCADE;
Параметр CASCADE распространяет изменение на все зависимые объекты
базы данных.
Создание типа вложенной таблицы
Вложенная таблица хранит неупорядоченное множество любого числа
элементов. Вы можете добавлять, изменять и удалять индивидуальные элементы
вложенной таблицы. Вложенная таблица не имеет максимального
размера, и вы можете хранить произвольное число элементов во вложенной
таблице.
446 Глава 13
В этом разделе вы увидите тип вложенной таблицы, который хранит
объектные типы t_address. Вы уже видели использование t_address в предыдущей
главе; он используется для представления адреса и определён
следующим образом:
□ CREATE TABLE t_address AS OBJECT (
street VARCHAR2(15),
c ity VARCHAR2(15),
state CHAR(2),
zip VARCHAR2(5)
);
/
Для создания вложенной таблицы используют выражение CREATE TYPE,
и следующий пример создаёт тип по имени t_nested_table_address, который
хранит объекты t_add ress:
□ CREATE TYPE t_nested_table_address AS TABLE OF t_address;
Обратите внимание, что вы не указываете максимальный размер вложенной
таблицы, потому что вложенная таблица может хранить любое
число элементов.
Использование типа коллекции для определения столбца
в таблице
После того, как вы создали тип коллекции, вы можете использовать его
для определения столбца в таблице. Вы увидите, как использовать типы
varray и вложенной таблицы, созданные в предыдущем разделе, для определения
столбца в таблице.
Использование типа varray для определения столбца в таблице
Следующее выражение создаёт таблицу по имени customers_with_varray,
которая использует тип t_va г ray_add ress для определения столбца по имени
addresses:
П CREATE TABLE customers_with_varray (
id INTEGER PRIMARY KEY,
first_name VARCHAR2(10),
last_name VARCHAR2(10),
addresses t_varray_address
);
Элементы в varray хранятся прямо внутри таблицы, если размер
varray равен или менее 4 кб; в противном случае varray хранится за пределами
таблицы. Когда varray хранится внутри таблицы, доступ к его
элементам осуществляется быстрее, чем доступ к элементам во вложенной
таблице.
Коллекции 447
Использование типа вложенной таблицы для определения столбца
таблицы
Следующее выражение создаёт таблицу по имени customers_with_nested_
table, которая использует t_nested_table_address для определения столбца
по имени addresses:
□ CREATE TABLE customers_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_addresses;
Фраза NESTED TABLE идентифицирует имя столбца вложенной таблицы
(addresses), а фраза STORE AS указывает имя вложенной таблицы (nested_
addresses), где хранятся конкретные элементы. Нельзя обратиться к вложенной
таблице независимо от таблицы, в которую она встроена.
Получение информации о коллекциях
Как вы увидите в этом разделе, для получения информации о ваших коллекциях
вы можете использовать команду DESCRIBE и пару пользовательских
представлений.
Получение информации о массивах переменной длины
В следующем примере описывается тип массива переменной длины t_
varray_address:
□ DESCRIBE t_varray_adress
t_varray_address VARRAY(2) OF VARCHAR2(50)
В следующем примере описывается таблица customers_with_varray, в которой
столбец addresses имеет тип t_varray_address:
□ DESCRIBE customers_with_varray
Name Null? Type
ID NOT NULL NUMBER(38)
FIRST_NAME VARCHAR2(10)
LAST_NAME VARCHAR2(10)
ADDRESSES T_VARRAY_Address