Учебники

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

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

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

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

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

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

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

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

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

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

  1. Атрибуты
  2. Участники / Методы

Атрибуты

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

Участники / Методы

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

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

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

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

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, типы объектов также должны быть объявлены перед использованием их в программе.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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);
/

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

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 членами. Он содержит определение конструкторов только с 3 параметрами. (Фактический неявный конструктор будет содержать количество параметров, равное количеству атрибутов, присутствующих в типе объекта)
  • Строка кода 10 : создание тела типа.
  • Строка кода 11-21 : определение явного конструктора. Присвоение значения параметра атрибутам и присвоение значения атрибуту «manager» со значением по умолчанию «1001».
  • Строка кода 22-26 : определение элемента ‘insert_records’, в котором значения атрибутов вставляются в таблицу ’emp’.
  • Строка кода 27-34 : определение элемента ‘display_records’, в котором отображаются значения атрибутов типа объекта.

Вывод

Тип создан

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

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

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

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», и значения атрибутов вставлены в таблицу.

Вывод

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

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

Зарплата: 20000

Менеджер: 1000

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

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

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’, и значения атрибутов были вставлены в таблицу.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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.

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

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 : создание тела для унаследованного типа объекта.
  • Строка кода 1 6 -21 : определение процедуры-члена, которая вставляет записи в таблицу «emp» со значениями из типа объекта «SUPER», за исключением значения менеджера. Для значения менеджера используется «default_manager» из типа «SUB».

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

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

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.

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

  • Шаг 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, которая сравнивает атрибут salary экземпляра 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 : Распечатать сообщение на основе номера возврата из функции ORDER.

Резюме

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