Лекция 13:
Объектно-ориентированное программирование в PL/SQL
A |
версия для печати
< Лекция 12 || Лекция 13: 12 3 || Лекция 14 >
Аннотация: В лекции обсуждаются вопросы создания и применения объектных типов, использование пакетов, реализация внешних процедур.
Ключевые слова: объектный тип , подпрограмма , атрибут объектного типа , объект , информация , инкапсуляция данных , спецификация типа , тело типа , CREATE TYPE , CREATE TYPE BODY , RAW , пакет , выходные параметры , MAP , ORDER , хеширование , скалярный тип , конструктор объектного типа , инициализация объекта , спецификация пакета , определение спецификации пакета , CREATE PACKAGE , определение тела пакета , CREATE PACKAGE BODY , общедоступный элемент , OCIS , встроенный SQL , PL/SQL , функция , операторы , CREATE PROCEDURE , CREATE FUNCTION , определение , формальный параметр , фактический параметр , позиционная нотация , именованная нотация , спецификация , тело процедуры , определение функции , перегружаемая подпрограмма , компилятор , поиск , рекурсивный вызов , переменная курсора , интерфейс , Pascal , время выполнения , место , список , вызов функции , внешняя функция
Объектные типы
Объектным типом называется определяемый пользователем тип данных, который инкапсулирует структуру данных и подпрограммы .
Переменные, используемые в структуре данных объектного типа, называются атрибутами, или переменными объектного типа. Функции и процедуры, определяющие поведение объекта, называются методами.
При объявлении переменной объектного типа создается объект с атрибутами и методами, определяемым его типом.
Информация об объектном типе сохраняется в базе данных.
К преимуществам применения объектных типов можно отнести следующие их возможности:
- использование объектных типов позволяет перемещать код управления данными из блоков PL/SQL в методы объекта с помощью инкапсуляции данных;
- объектный тип ограничивает доступ к структуре объекта, предоставляя свои методы для работы с данными;
- объектные типы хорошо реализуются классами объектно-ориентированных языков программирования.
Спецификация и тело объектного типа
Объектный тип состоит из двух частей: спецификации и тела.
Спецификация типа доступна в клиентском приложении. Тело типа скрыто, но разработчик существующего в базе данных типа имеет возможность изменять реализацию методов.
Спецификация типа создается оператором CREATE TYPE , который, с некоторыми сокращениями, может иметь следующее формальное описание:
CREATE [OR REPLACE] TYPE [schema .]
type_name
{ { IS | AS } OBJECT }
[ { attribute datatype
[sqlj_object_type_attr] } ] |
{ [ {[[[NOT] OVERRIDING]
[[NOT] FINAL] [[NOT] INSTANTIABLE]]
{ { MEMBER | STATIC }
{ procedure_spec | function_spec } |
{{ MAP | ORDER } MEMBER function_spec}}}]
.,:}
[[NOT] FINAL] [[NOT] INSTANTIABLE];
Определение функции ( function_spec ) указывается как
FUNCTION name (parameter datatype .,:)
{ RETURN datatype }
Определение процедуры ( procedure_spec ) указывается как
PROCEDURE name (parameter datatype .,:)
Тело типа создается оператором CREATE TYPE BODY , который, с некоторыми сокращениями, может иметь следующее формальное описание:
[CREATE TYPE BODY type_name {IS | AS}
{ {MAP | ORDER}
MEMBER function_body;
| MEMBER {procedure_body |
function_body};}
[MEMBER {procedure_body |
function_body};]... END;]
Создание объектного типа выполняется в два этапа: сначала оператором CREATE TYPE создается спецификация типа, а затем оператором CREATE TYPE BODY создается тело типа .
Например:
- Создание объектного типа
CREATE TYPE MyT AS OBJECT (
r1 REAL, - Атрибуты типа
r2 REAL,
MEMBER FUNCTION plus (x MyT)
RETURN MyT
);
CREATE TYPE BODY MyT AS
MEMBER FUNCTION plus (x MyT)
RETURN MyT IS
BEGIN
RETURN MyT (r1 + x.r1,
r2 + x.r2);
END plus;
END;
- Применение переменной объектного типа:
DECLARE- Создается объект с1 типа MyT
с1 MyT;
BEGIN
- Вызов конструктора
с1 := MyT (1,1);
END;
На атрибут объектного типа накладываются следующие ограничения:
- типом атрибута может быть любой тип данных Oracle за исключением некоторых типов, включая типы LONG, LONG RAW, NCHAR, NCLOB, NVARCHAR2, ROWID, BOOLEAN, PLS_INTEGER, RECORD, REF CURSOR, %TYPE и %ROWTYPE, а также типы, определенные в пакете PL/SQL;
- при объявлении атрибута его нельзя инициализировать, используя оператор присваивания или ключевое слово DEFAULT ;
- на атрибут не может быть наложено ограничение NOT NULL.
Типом атрибута может быть любой допустимый тип или другой объектный тип, называемый в этом случае вложенным объектным типом.
Объектные типы могут применяться при создании таблиц как типы полей.
Например:
CREATE TYPE typ1 AS OBJECT (a1 NUMBER,
MEMBER FUNCTION getf1 RETURN NUMBER);
- :
- Создание таблицы
CREATE TABLE tbl1(col typ1);
- :
- Вызов метода объектного типа
SELECT col.getf1() FROM tbl1;
Спецификация объектного типа должна включать объявление каждого общедоступного метода, реализация которого записывается в теле объектного типа.
Перед названием метода объектного типа при спецификации объектного типа и описании тела этого типа всегда указывается ключевое слово MEMBER.
Для квалификации атрибутов в методах объектного типа можно использовать ключевое слово SELF, рассматриваемое как ссылка на данный объект. Однако синтаксис языка PL/SQL не требует обязательной квалификации атрибута. Параметр SELF может быть указан первым параметром функции и процедуры и явным способом. Если параметр SELF явно не указывается, то для функции предполагается определение параметра с опцией IN (входной параметр), а для процедуры - с опцией IN OUT (входной-выходной параметр).
Объектный тип может иметь перегружаемые методы.
Сравнение значений объектного типа
В отличие от значений скалярных типов для значений объектных типов не существует единого правила их сравнения. В языке PL/SQL определены ключевые слова MAP и ORDER , которые позволяют специфицировать метод, определяющий правила сравнения значений объектного типа. Объектный тип может иметь только один метод, выполняющий сравнение экземпляров данного типа, - MAP-метод или ORDER-метод.
В зависимости от значения объектного типа MAP-метод можно рассматривать как некоторую функцию хеширования.
ORDER-метод - это функция с двумя параметрами (первый из которых является встроенным по умолчанию), возвращающая значение скалярного типа ( DATE, NUMBER, VARCHAR2, CHARACTER или REAL ), получаемое при сравнении первого параметра, всегда равного SELF, со вторым параметром, указывающим объект этого же типа.
В SQL-операторах всегда можно сравнивать два значения объектного типа на эквивалентность - полное совпадение значений всех атрибутов, но выполнять сравнение на упорядочивание можно только в том случае, если объектный тип имеет MAP-метод или ORDER-метод.
Конструкторы объектного типа
Oracle по умолчанию для каждого объектного типа создает конструктор, одноименный с названием типа.
Конструктор используется для инициализации и возвращения экземпляра объектного типа. При инициализации объекта вызывается конструктор со списком параметров, которые определяют атрибуты в порядке их объявления.