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

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

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

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

Типы объектов в PL/SQL

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

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

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

PL/SQL Тип объекта содержит в основном два компонента.

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

Атрибуты

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

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

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

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

Тип объекта не может быть создан на уровне подпрограммы. Их можно создать только на уровне схемы. Как только тип объекта определен в схеме, его можно использовать в подпрограммах. Тип объекта можно создать с помощью CREATE TYPE. Тело типа можно создать только после создания его типа объекта.

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

CREATE TYPE<object_type_name> AS OBJECT
(
<attribute_l><datatype>,
.
.
);
/
CREATE TYPE BODY<object_type_name> AS OBJECT
(
MEMBER[PROCEDURE|FUNCTION]<member_name> 
IS
<declarative section>
BEGIN
<execution part>
END;‭
.
.	‬
);
/

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

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

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

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

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

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

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

DECLARE
<variable_name> <object_type_name>;
BEGIN
.
.
END;
/

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

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

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

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

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

DECLARE
<variable_name> <object_type_name>; 
BEGIN
<variable_name>:=<object_type_name>();
END;
/

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

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

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

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

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

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

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

  • Step1:
  • Создать тип объекта
  • Тело типа объекта
  • Шаг 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 AS
CONSTRUCTOR FUNCTION emp_object(p_emp_no NUMBER,p_emp_name VARCHAR2,
p_salary NUMBER)
RETURN SELF AS RESULT
IS
BEGIN
Dbms_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_records
IS
BEGIN
INSERT INTO emp VALUES(emp_noemp_name,salary,manager);
END
MEMBER PROCEDURE display_records
IS
BEGIN
Dbms_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 членами. Он содержит определение конструкторов всего с тремя параметрами. (Фактический неявный конструктор будет содержать количество параметров, равное количеству атрибутов, присутствующих в типе объекта)
  • Строка кода 10: Создание тела типа.
  • Строка кода 11–21: определение явного конструктора. Присвоение значения параметра атрибутам и присвоение значения атрибуту «менеджер» со значением по умолчанию «1001».
  • Строка кода 22–26: определение члена «insert_records», в котором значения атрибутов вставляются в таблицу «emp».
  • Строка кода 27–34: определение члена display_records, в котором отображаются значения атрибутов типа объекта.

Результат

Тип создан

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

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

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

DECLARE
guru_emp_det emp_object;
BEGIN
guru_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» вызывает функцию-член «diplay_records», и отображаются значения атрибутов.
  • Строка кода 42: Оператор «guru_emp_det.insert_records» вызывает функцию-член «insert_records», и значения атрибутов вставляются в таблицу.

Результат

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

Номер сотрудника: 1005

Зарплата: 20000

Менеджер: 1000

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

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

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

Результат

Employee Name:PPP 
Employee Number:1006 
Salary:20000 
Manager: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», и значения атрибутов вставляются в таблицу.

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

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

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

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

CREATE TYPE <object_type_name_parent> AS OBJECT
(
<attribute_l><datatype>,
.
.
)NOT FINAL;
/

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

  • Приведенный выше синтаксис показывает создание типа SUPER.

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

CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent>
(
<attribute_l><datatype>,
.
);
/

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

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

Example1: В приведенном ниже примере мы собираемся использовать свойство наследования, чтобы вставить запись с идентификатором менеджера как «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 членами. Он содержит определение конструкторов всего с тремя параметрами. Он был объявлен как «НЕ ОКОНЧАТЕЛЬНЫЙ», поэтому это родительский тип.

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

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

CREATE OR REPLACE TYPE sub_emp_object 
UNDER emp_object
(default_manager NUMBER,MEMBER PROCEDURE insert_default_mgr);
/


CREATE OR REPLACE TYPE BODY sub_emp_object 
AS
MEMBER PROCEDURE insert_default_mgr 
IS
BEGIN
INSERT INTO emp
VALUES(emp_no,emp_name:salary,manager):
END;
END;
/

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

  • Строка кода 10–13: Создание sub_emp_object как унаследованного типа с дополнительным атрибутом default_manager и объявлением процедуры-члена.
  • Строка кода 14: Создание тела для унаследованного типа объекта.
  • Строка кода 16-21: Определение процедуры-члена, которая вставляет записи в таблицу «emp» со значениями из типа объекта «СУПЕР», за исключением значения менеджера. В качестве значения менеджера используется default_manager из типа SUB.

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

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

DECLARE
guru_emp_det sub_emp_object;
BEGIN
guru_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.

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

CREATE TYPE BODY<object_type_name_ 1>AS OBJECT
(
  ORDER MEMBER FUNCTION match(<parameter> object_type_name_ 1)
  RETURN INTEGER IS		
  BEGIN
    IF <attribute_name>parameter <attribute_name>THEN
      RETURN -1; --any negative number will do
    ELSIF id>c.id THEN
      RETURN 1; —any positive number will do
    ELSE
      RETURN 0;
    END IF;
  END;
  .
  .
);
/

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

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

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

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

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

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

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

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 AS
ORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGER 
IS
BEGIN‭	‬
IF salary<c.salary
THEN RETURN -1;
ELSIF salary>c.salary
THEN RETURN 1;
ELSE
RETURN 0;
END IF:‭	‬
END;
END;
/

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

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

Вывод кода:

Тип создан

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

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

DECLARE
l_obj_l emp_object_equality;
l_obj_2 emp_object_equality;
BEGIN
l_obj_l:=emp_object_equality(15000); 
l_obj_2:=emp_object_equality(17000);
IF l_obj_1.equalS(l_obj_2)>0
THEN
Dbms_output.put_line(’Salary of first instance is greater’):
ELSIF l_obj_l.equalS(l_obj_2)<0
THEN
Dbms_output.put_line(’Salary of second instance is greater’); 
ELSE
Dbms_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.