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

Создание типов коллекций

В этом разделе вы увидите, как создавать тип 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