В этой статье дается краткий обзор тех важных функциональных средств Oracle, которые помогают облегчать процесс объектно-ориентированного программирования. Центральную роль в объектно-ориентированном программировании в Oracle играют абстрактные типы (abstract types), также называемые объектными типами (object types). В отличие от обычных типов данных, абстрактные типы содержат не только структуру данных, но и необходимые для манипулирования ими функции и процедуры, объединяя данные и поведение.
Объектные типы похожи на другие объекты схемы и состоят из имени, атрибутов и методов. Они напоминают концепцию классов в C++ и Java. Предлагаемая Oracle поддержка для объектно-ориентированных функциональных средств, таких как типы, делает вполне возможной реализацию объектно-ориентированных механизмов наподобие инкапсуляции и абстракции при моделировании сложных объектов и процессов из реальной жизни. Вдобавок в Oracle поддерживается одиночное наследование определяемых пользователем типов SQL.
Команда CREATE TYPE
Объектные типы создаются пользователями и хранятся в базе данных подобно другим типам данных Oracle, например, VARCHAR2
. Команда CREATE TYPE
позволяет создавать абстрактный шаблон, соответствующий объекту реального мира. Ниже приведен пример применения этой команды:
SQL> CREATE TYPE person AS object 2 (name varchar2(30), 3 phone varchar2(20)); Type created. SQL>
Объектная таблица
Объектные таблицы содержат объекты вроде типа person
, который был создан в предыдущем разделе. Ниже приведен пример создания объектной таблицы:
SQL> CREATE TABLE person_table OF person; Table created. SQL>
Интересная часть заключается вот в чем. В объектных таблицах не бывает однозначных (содержащих одно значение) столбцов, как в обычных таблицах Oracle: все столбцы в них являются типами и потому могут хранить несколько значений. Объектные таблицы можно использовать для просмотра данных как в виде таблицы с одним столбцом, так и в виде таблицы с множеством столбцов, состоящей из компонентов объектного типа. Ниже приведен пример, показывающий, как можно вставлять данные в объектную таблицу:
SQL> INSERT INTO person_table 2 VALUES 3 ('john smith', '1-800-555-9999'); 1 row created. SQL>
Коллекции
Коллекции (collections) идеально подходят для представления между данными отношений типа “один ко многим”. В Oracle поддерживаются два основных типа коллекций: массивы VARRAY
и вложенные таблицы
. Все они более детально рассматриваются в двух следующих разделах моей статьи.
Массивы VARRAY
Массив VARRAY
представляет собой упорядоченную коллекцию данных. Каждый элемент в этом массиве имеет определенный индекс, который используется для получения к нему доступа. Ниже показано, как можно объявлять тип VARRAY
:
SQL> CREATE TYPE prices AS VARRAY (10) OF NUMBER (12,2);
Вложенные таблицы
Вложенная таблица (nested table) представляет собой упорядоченный набор элементов данных. Этот упорядоченный набор может относиться как к объектному типу, так и к какому-нибудь из встроенных типов Oracle. Ниже приведен простой пример:
SQL> CREATE TYPE lineitem_table AS TABLE OF lineitem;
Для получения доступа к элементам коллекции с помощью SQL-кода можно использовать оператор TABLE
, как показано в следующем примере. Здесь history
— это вложенная таблица, а courses
— столбец, в который требуется вставить данные:
SQL> INSERT INTO TABLE(SELECT courses FROM department WHERE name = 'History') VALUES('Modern India');
Наследование типов
Создавать можно не только типы, но и иерархии типов, состоящие из родительских супертипов и дочерних подтипов, связанных с родительскими узами наследования. Ниже приведен пример создания подтипа из супертипа. Сначала создается супертип:
SQL> CREATE TYPE person_t AS OBJECT ( name varchar2(80), social_sec_no number, hire_date date, member function age() RETURN number, member function print() RETURN varchar2) NOT FINAL;
Затем создается подтип, который будет наследовать все атрибуты и методы от данного супертипа:
SQL> CREATE TYPE employee_t UNDER person_t (salary number, commission number, member function wages () RETURN number, OVERRIDING member function print () RETURN varchar2);
Операция CAST
Операция CAST
позволяет делать две вещи: преобразовывать встроенные типы данных, а также преобразовывать значение типа-коллекции в другое значение типа-коллекции.
Ниже приведен пример применения операции CAST
со встроенными типами данных:
SQL> SELECT product_id, CAST(description AS VARCHAR2(30)) FROM product_desc;