Учебное пособие по типам объектов Oracle PL / SQL с ПРИМЕРАМИ

Содержание:

Anonim

Что такое тип объекта в PL / SQL?

Объектно-ориентированное программирование особенно подходит для создания повторно используемых компонентов и сложных приложений. Они организованы вокруг «объектов», а не «действий», т.е. программы предназначены для работы и взаимодействия со всем объектом, а не с отдельным действием. Эта концепция позволяет программисту заполнять и манипулировать деталями на уровне сущностей объекта.

На рисунке ниже показан пример типа объекта, в котором банковский счет считается сущностью объекта. Атрибуты объекта включают в себя вещи, которые содержат некоторые значения атрибутов, например, в Банковском счете; это номер счета, остаток в банке и т. д., в то время как методы объекта описывают такие вещи, как расчет процентной ставки, создание выписки по счету и т. д., что требует завершения определенного процесса.

В PL / SQL объектно-ориентированное программирование основано на типах объектов.

Тип объекта может представлять любую сущность реального мира. В этой главе мы собираемся обсудить больше типов объектов.

В этом уроке вы узнаете,

  • Компоненты типов объектов
  • Создать объект в Oracle
  • Объявление инициализации типа объекта
  • Конструкторы
  • Наследование в типе объекта
  • Равенство объектов PL / SQL

Компоненты типов объектов

Тип объекта PL / SQL состоит в основном из двух компонентов.

  1. Атрибуты
  2. Члены / методы

Атрибуты

Атрибуты - это столбец или поле, в котором хранятся данные. Каждый атрибут будет сопоставлен с типом данных, который определяет тип обработки и хранения для этого атрибута. Атрибут может иметь любой допустимый тип данных PL / SQL или другой тип объекта.

Члены / методы

Члены или методы - это подпрограммы, определенные в типе объекта. Они не используются для хранения каких-либо данных. В основном они используются для определения процесса внутри типа объекта. Например, проверка данных перед заполнением типа объекта. Они объявлены в разделе типа объекта и определены в разделе тела типа объекта этого типа объекта. Раздел тела в типе объекта является необязательной частью. Если членов нет, то тип объекта не будет содержать части тела.

Создать объект в Oracle

Тип объекта не может быть создан на уровне подпрограммы, они могут быть созданы только на уровне схемы. Как только тип объекта определен в схеме, то же самое можно использовать в подпрограммах. Тип объекта может быть создан с помощью «СОЗДАТЬ ТИП». Тело типа может быть создано только после создания его объектного типа.

CREATE TYPE AS OBJECT(,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION]ISBEGINEND;‭… ‬);/

Объяснение синтаксиса:

  • Приведенный выше синтаксис показывает создание OBJECT с атрибутами и OBJECT-BODY с методами.
  • Методы также могут быть перегружены в теле объекта.

Объявление инициализации типа объекта

Как и другие компоненты в PL / SQL, типы объектов также необходимо объявить перед их использованием в программе.

После создания типа объекта его можно использовать в декларативном разделе подпрограммы для объявления переменной этого типа объекта.

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

DECLARE ;BEGIN… END;/

Объяснение синтаксиса:

  • Приведенный выше синтаксис показывает объявление переменной как типа объекта в декларативном разделе.

После того, как переменная объявлена ​​как объектный тип в подпрограмме, она будет атомарно нулевой, то есть сам весь объект будет нулевым. Его необходимо инициализировать значениями, чтобы использовать их в программе. Их можно инициализировать с помощью конструкторов.

Конструкторы - это неявный метод объекта, на который можно ссылаться с тем же именем, что и у типа объекта. Синтаксис ниже показывает инициализацию типа объекта.

DECLARE ;BEGIN:=();END;/

Объяснение синтаксиса:

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

Конструкторы

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

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

Пример 1 : В следующем примере мы собираемся использовать член типа объекта для вставки записи в таблицу emp со значениями ('RRR', 1005, 20000, 1000) и ('PPP', 1006, 20000, 1001). После того, как данные вставлены, мы собираемся отобразить то же самое, используя член типа объекта. Мы также собираемся использовать явный конструктор для заполнения идентификатора менеджера по умолчанию значением 1001 для второй записи.

Мы собираемся выполнить это в следующих шагах.

  • Шаг 1:
    • Создать тип объекта
    • Тип объекта body
  • Шаг 2: Создание анонимного блока для вызова созданного типа объекта через неявный конструктор для emp_no 1005.
  • Шаг 3. Создание анонимного блока для вызова созданного типа объекта через явный конструктор для emp_no 1006.

Шаг 1) Создайте тип объекта и тело типа объекта

CREATE TYPE emp_object AS OBJECT(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager NUMBER,CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER, p_emp_name VARCHAR2,p_salary NUMBER) RETURN SELF AS RESULT),MEMBER PROCEDURE insert_records,MEMBER PROCEDURE display_records);/
CREATE OR REPLACE TYPE BODY emp_object ASCONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,p_salary NUMBER)RETURN SELF AS RESULTISBEGINDbms_output.put_line(’Constructor fired… ');SELF.emp_no:=p_emp_no;|SELF.emp_name:=p_emp_name;SELF.salary:=p_salary;SELF.managerial:=1001;RETURN;END:MEMBER PROCEDURE insert_recordsISBEGININSERT INTO emp VALUES(emp_noemp_name,salary,manager);ENDMEMBER PROCEDURE display_recordsISBEGINDbms_output.put_line('Employee Name:'||emp_name);Dbms_output.put_line('Employee Number:'||emp_no);Dbms_output.put_line('Salary':'||salary);Dbms_output.put_line('Manager:'||manager);END:END:/

Код Пояснение

  • Строка кода 1-9 : Создание типа объекта emp_object с 4 атрибутами и 3 членами. Он содержит определение конструкторов всего с 3 параметрами. (Фактический неявный конструктор будет содержать количество параметров, равное количеству атрибутов, присутствующих в типе объекта)
  • Строка кода 10 : Создание тела шрифта.
  • Строка кода 11-21 : определение явного конструктора. Присвоение значения параметра атрибутам и присвоение значения атрибуту 'manager' со значением по умолчанию '1001'.
  • Строка кода 22-26 : Определение элемента insert_records, в котором значения атрибутов вставляются в таблицу emp.
  • Строка кода 27-34 : Определение элемента display_records, в котором отображаются значения атрибутов типа объекта.

Выход

Тип создан

Тип тела создан

Шаг 2) Создание анонимного блока для вызова созданного типа объекта через неявный конструктор для emp_no 1005

DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1005,’RRR',20000,1000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;

Код Пояснение

  • Строка кода 37-45 : Вставка записей с использованием неявного конструктора. Вызов конструктора содержит фактическое количество значений атрибутов.
  • Строка кода 38 : объявляет guru_emp_det как тип объекта emp_object.
  • Строка кода 41 : выражение guru_emp_det.display_records называется функцией-членомiplay_records, и отображаются значения атрибутов.
  • Строка кода 42 : инструкция guru_emp_det.insert_records вызывает функцию-член insert_records, и значения атрибутов вставляются в таблицу.

Выход

Имя сотрудника: RRR

Количество сотрудников: 1005

Заработная плата: 20000

Управляющий: 1000

Шаг 3) Создание анонимного блока для вызова созданного типа объекта через явный конструктор для emp_no 1006

DECLAREguru_emp_det emp_object;BEGINguru_emp_det:=emp_object(1006,'PPP',20000);guru_emp_det.display_records;guru_emp_det.insert_records;COMMIT;END;/

Выход

Employee Name:PPPEmployee Number:1006Salary:20000Manager:1001

Пояснение к коду:

  • Строка кода 46-53 : Вставка записей с использованием явного конструктора.
  • Строка кода 46 : объявляет guru_emp_det как тип объекта emp_object.
  • Строка кода 50 : выражение guru_emp_det.display_records называется функцией-членом display_records, и отображаются значения атрибутов.
  • Строка кода 51 : инструкция guru_emp_det.insert_records вызывает функцию-член insert_records, и значения атрибутов вставляются в таблицу.

Наследование в типе объекта

Свойство наследования позволяет типу подобъекта получить доступ ко всем атрибутам и членам типа суперобъекта или типа родительского объекта.

Тип подобъекта называется унаследованным типом объекта, а тип суперобъекта - типом родительского объекта. Синтаксис ниже показывает, как создать родительский и унаследованный тип объекта.

CREATE TYPE  AS OBJECT(,… )NOT FINAL;/

Объяснение синтаксиса:

  • Приведенный выше синтаксис показывает создание типа SUPER.
CREATE TYPEUNDER(,.);/

Объяснение синтаксиса:

  • Приведенный выше синтаксис показывает создание типа SUB. Он содержит все элементы и атрибуты родительского типа объекта.

Пример 1. В приведенном ниже примере мы собираемся использовать свойство наследования, чтобы вставить запись с идентификатором менеджера как «1002» для следующей записи («RRR», 1007, 20000).

Мы собираемся выполнить указанную выше программу в следующих шагах

  • Шаг 1: Создайте тип SUPER.
  • Шаг 2: Создайте тип и тело SUB.
  • Шаг 3: Создание анонимного блока для вызова типа SUB.

Шаг 1) Создайте тип SUPER или родительский тип.

CREATE TYPE emp_object AS OBJECT(emp_no NUMBER,emp_name VARCHAR2(50),salary NUMBER,manager NUMBER,CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2(50),p_salary NUMBER)RETURN SELF AS RESULT),MEMBER PROCEDURE insert_records,MEMBER PROCEDURE display_records)NOT FINAL;/

Пояснение к коду:

  • Строка кода 1-9 : Создание типа объекта emp_object с 4 атрибутами и 3 членами. Он содержит определение конструкторов всего с 3 параметрами. Он был объявлен как «НЕ ОКОНЧАТЕЛЬНЫЙ», так что это родительский тип.

Шаг 2) Создайте тип SUB под типом SUPER.

CREATE OR REPLACE TYPE sub_emp_objectUNDER emp_object(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);/CREATE OR REPLACE TYPE BODY sub_emp_objectASMEMBER PROCEDURE insert_default_mgrISBEGININSERT INTO empVALUES(emp_no,emp_name:salary,manager):END;END;/

Пояснение к коду:

  • Строка кода 10-13 : Создание sub_emp_object как унаследованного типа с одним дополнительным атрибутом default_manager и объявлением процедуры-члена.
  • Строка кода 14 : Создание тела для унаследованного типа объекта.
  • Строка кода 1 6 -21 : Определение процедуры-члена, которая вставляет записи в таблицу "emp" со значениями из типа объекта 'SUPER', за исключением значения менеджера. В качестве значения менеджера используется default_manager из типа SUB.

Шаг 3) Создание анонимного блока для вызова типа SUB

DECLAREguru_emp_det sub_emp_object;BEGINguru_emp_det:= sub_emp_object(1007,'RRR',20000,1000,1002);guru_emp_det.insert_default_mgr;COMMIT;END;/

Пояснение к коду:

  • Строка кода 25 : Объявление guru_emp_det как типа sub_emp_object.
  • Строка кода 27 : Инициализация объекта с помощью неявного конструктора. Конструктор имеет 5 параметров (4 атрибута из типа PARENT и 2 атрибута из типа SUB). Последний параметр (1002) определяет значение атрибута default_manager.
  • Строка кода 28 : Вызов элемента insert_default_mgr для вставки записей с идентификатором менеджера по умолчанию, переданным в конструктор.

Равенство объектов PL / SQL

Экземпляр объекта, который принадлежит одним и тем же объектам, можно сравнить на равенство. Для этого нам нужен специальный метод в типе объекта, называемый методом ORDER.

Этот метод ORDER должен быть функцией, возвращающей числовой тип. В качестве входных данных он принимает два параметра (первый параметр: идентификатор экземпляра собственного объекта, второй параметр: идентификатор другого экземпляра объекта).

Идентификатор двух экземпляров объекта сравнивается, и результат возвращается в числовом формате.

  • Положительное значение означает, что экземпляр объекта SELF больше другого экземпляра.
  • Отрицательное значение означает, что экземпляр объекта SELF меньше другого экземпляра.
  • Ноль означает, что экземпляр объекта SELF равен другому экземпляру.
  • Если какой-либо из экземпляров имеет значение NULL, эта функция вернет значение NULL.
CREATE TYPE BODYAS OBJECT(ORDER MEMBER FUNCTION match(
 object_type_name_ 1)RETURN INTEGER IS BEGINIF parameter THENRETURN -1; --any negative number will doELSIF id>c.id THENRETURN 1; -any positive number will doELSERETURN 0;END IF;END;… );/

Объяснение синтаксиса:

  • Приведенный выше синтаксис показывает функцию ORDER, которую необходимо включить в тело типа для проверки равенства.
  • Параметр этой функции должен быть экземпляром того же типа объекта.
  • Вышеупомянутая функция может быть вызвана как «obj_instance_1.match (obj_instance_2)», и это выражение вернет числовое значение, как показано, где obj_instance_1 и obj_instance_2 являются экземпляром object_type_name.

Пример1 : В следующем примере мы увидим, как сравнить два объекта. Мы собираемся создать два экземпляра, и мы собираемся сравнить атрибут «зарплата» между ними. Мы собираемся проделать два шага.

  • Шаг 1: Создание типа и тела объекта.
  • Шаг 2: Создание анонимного блока для вызова сравнения экземпляра объекта.

Шаг 1) Создание типа и тела объекта.

CREATE TYPE emp_object_equality AS OBJECT(salary NUMBER,ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER);/
CREATE TYPE BODY emp_object_equality ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN‭ ‬IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF:‭ ‬END;END;/

Пояснение к коду:

  • Строка кода 1-4: Создание типа объекта emp_object_equality с 1 атрибутом и 1 членом.
  • Строка кода 6-16 : определение функции ORDER, которая сравнивает атрибут «salary» экземпляра SELF и тип экземпляра параметра. Он возвращает отрицательное значение, если заработная плата SELF меньше или положительная, если зарплата SELF больше, и 0, если зарплаты равны.

Вывод кода:

Тип создан

Шаг 2) Создание анонимного блока для вызова сравнения экземпляра объекта.

DECLAREl_obj_l emp_object_equality;l_obj_2 emp_object_equality;BEGINl_obj_l:=emp_object_equality(15000);l_obj_2:=emp_object_equality(17000);IF l_obj_1.equalS(l_obj_2)>0THENDbms_output.put_line(’Salary of first instance is greater’):ELSIF l_obj_l.equalS(l_obj_2)<0THENDbms_output.put_line(’Salary of second instance is greater’);ELSEDbms_output.put_line(’Salaries are equal’);END IF;END;/

Выход

Salary of second instance is greater

Пояснение к коду:

  • Строка кода 20 : Объявление l_obj_1 типа emp_object_equality.
  • Строка кода 21 : Объявление l_obj_2 типа emp_object_equality.
  • Строка кода 23 : Инициализация l_obj_1 со значением зарплаты как '15000'
  • Строка кода 24 : Инициализация l_obj_1 со значением зарплаты как '17000'
  • Строка кода 25-33 : Распечатайте сообщение на основе числа, возвращаемого функцией ЗАКАЗ.

Резюме

В этой главе мы рассмотрели тип объекта и его свойства. Мы также обсудили конструкторы, члены, атрибуты, наследование и равенство в объектах PL / SQL.