MyTetra Share
Делитесь знаниями!
Объектные типы
Время создания: 13.11.2017 23:31
Раздел: PL/SQL - Patterns - ООП
Запись: xintrea/mytetra_db_mcold/master/base/1510605088umnag2t07j/text.html на raw.githubusercontent.com

Лекция 13: 

Объектно-ориентированное программирование в PL/SQL

A | 

версия для печати

< Лекция 12  || Лекция 1312 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 за исключением некоторых типов, включая типы LONGLONG RAWNCHARNCLOBNVARCHAR2ROWIDBOOLEANPLS_INTEGERRECORDREF 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-метод - это функция с двумя параметрами (первый из которых является встроенным по умолчанию), возвращающая значение скалярного типа ( DATENUMBERVARCHAR2CHARACTER или REAL ), получаемое при сравнении первого параметра, всегда равного SELF, со вторым параметром, указывающим объект этого же типа.

В SQL-операторах всегда можно сравнивать два значения объектного типа на эквивалентность - полное совпадение значений всех атрибутов, но выполнять сравнение на упорядочивание можно только в том случае, если объектный тип имеет MAP-метод или ORDER-метод.

Конструкторы объектного типа

Oracle по умолчанию для каждого объектного типа создает конструктор, одноименный с названием типа.

Конструктор используется для инициализации и возвращения экземпляра объектного типа. При инициализации объекта вызывается конструктор со списком параметров, которые определяют атрибуты в порядке их объявления.

 
MyTetra Share v.0.59
Яндекс индекс цитирования