■ Вы можете использовать объект подтипа вместо объекта супертипа,
что даёт гибкость при хранении и обработке связанных типов. Если
вы хотите предотвратить использование объекта подтипа вместо
объекта супертипа, вы можете пометить объектную таблицу или объектный
столбец как NOT SUBSTITUTABLE.
■ Вы можете использовать некоторые полезные функции с объектами,
такие как REF ( ) , DEREF ( ) , VALUE ( ) , IS OF ( ) , SYS_TYPEID ( ) , и
TREATO.
■ Вы можете пометить объектный тип как NOT INSTANTIABLE, что предотвратит
создание объектов этого типа. Вам потребуется помечать объектные
типы как NOT INSTANTIABLE в случае, если вы планируете использовать
тип как абстрактный супертип без создания конкретных
объектов этого типа.
■ Вы можете определять собственные конструкторы, чтобы выполнять
такие действия, как программная установка атрибутов объекта
по умолчанию.
■ Вы можете переопределить метод супертипа методом подтипа, что
позволяет гибко создавать методы в иерархии типов.
■ Вы можете использовать новую возможность обобщённого вызова базы
данных Oracle l l g для вызова методов супертипа из подтипа. Это
позволяет экономить усилия и делает код более лёгким для работы.
В следующей главе вы ознакомитесь с коллекциями.
Глава 13
Коллекции
Знакомство с коллекциями
В базе данных Oracle 8 появились два новых типа данных, получившие название
коллекций (collections), которые позволяют хранить наборы элементов.
В базе данных Oracle 9i эти возможности были расширены за счет
включения многоуровневых коллекций, которые позволяют создавать
коллекции, элементы которых сами являются коллекциями. В базе данных
Oracle 10g произошли дальнейшие усовершенствования коллекций, например
появились ассоциативные массивы и многое другое.
Есть три основных типа коллекций.
■ VARRAY (массив переменной длины). Массивы переменной длины похожи
на массивы в Java, C++ и С#. Массивы переменной длины хранят
упорядоченное множество элементов, где каждый элемент имеет индекс,
определяющий его положение в массиве. Элементы в массиве
переменной длины могут изменяться только как целое, но не индивидуально;
это означает, что даже если вы хотите изменить всего
один элемент, вы должны предоставить все элементы для VARRAY. У
этого массива есть максимальный размер, который устанавливается
при его создании, но впоследствии можно изменить этот размер.
■ Вложенные таблицы. Вложенной таблицей называется таблица, встроенная
в другую таблицу. Во вложенную таблицу можно вставлять индивидуальные
элементы, а также обновлять или удалять их. Поскольку
можно модифицировать индивидуальные элементы вложенной
таблицы, это делает их более гибкими, чем массивы переменной
длины, так как элементы массива переменной длины можно модифицировать
только как единое целое, а не индивидуально. Вложенная
таблица не имеет максимального размера, поэтому в ней можно хранить
сколько угодно элементов.
■ Ассоциативные массивы (ранее известные под названием индекс-таблиц).
Ассоциативный массив похож на хешированную таблицу в Java. Появившийся
в Oracle 10g ассоциированный массив представляет собой
множество пар ключей и значений. Можно получить значение
из массива, используя его ключ (который может быть строкой) или
целое число, определяющее положение требуемого значения в массиве.
Ассоциативный массив можно использовать только в PL/SQL,
его нельзя сохранить в базе данных.
Вы можете спросить, зачем вообще использовать коллекции? В конце
концов, использование двух таблиц с внешним ключом позволяет модеКоллекции
445
лировать отношения между данными. Ответ состоит в том, что коллекции
следуют объектно-ориентированному стилю современного программирования,
а кроме того, к данным, хранящимся в коллекциях, база данных
может получить доступ быстрее, чем при использовании двух таблиц.
В каталоге SQL есть сценарий SQI?Plus по имени collection_schema.sql.
Сценарий создает пользователя collection_user с паролем collection_
password и все коллекции и таблицы, используемые в первой части этой
главы. Вы должны запускать этот сценарий, работая под пользователем с
необходимыми привилегиями для создания нового пользователя с привилегиями
CONNECT и RESOURCE; я для этого загружаюсь под пользователем
system. После того, как сценарий будет выполнен, вы будете загружены
под пользователем collection_user.