Что такое тип объекта в PL / SQL?
Объектно-ориентированное программирование особенно подходит для создания многократно используемых компонентов и сложных приложений. Они организованы вокруг «объектов», а не «действий», т.е. программы предназначены для работы и взаимодействия со всем объектом, а не с одним действием. Эта концепция позволяет программисту заполнять и манипулировать деталями на уровне объектов объекта.
Ниже на рисунке изображен пример типа объекта, в котором банковский счет считается объектом объекта. Атрибуты объекта включают вещи, которые содержат некоторые значения атрибутов, например, в банковском счете; это номер счета, баланс банка и т. д., в то время как методы объекта описывают такие вещи, как расчет процентной ставки, формирование выписки по счету и т. д., которые требуют выполнения определенного процесса.
В PL / SQL объектно-ориентированное программирование основано на объектных типах.
Тип объекта может представлять любую сущность реального мира. Мы собираемся обсудить больше типов объектов в этой главе.
В этом уроке — вы узнаете,
- Компоненты типов объектов
- Создать объект в Oracle
- Объявление инициализации типа объекта
- Конструкторы
- Наследование в типе объекта
- Равенство объектов PL / SQL
Компоненты типов объектов
Тип объекта PL / SQL содержит в основном два компонента.
- Атрибуты
- Участники / Методы
Атрибуты
Атрибуты — это столбец или поле, в котором хранятся данные. Каждый атрибут будет сопоставлен с типом данных, который определяет тип обработки и хранения для этого атрибута. Атрибут может иметь любой допустимый тип данных PL / SQL или другой тип объекта.
Участники / Методы
Члены или Методы — это подпрограммы, определенные в типе объекта. Они не используются для хранения каких-либо данных. Они в основном используются для определения процесса внутри типа объекта. Для примеров проверки данных перед заполнением типа объекта. Они объявлены в разделе типа объекта и определены в разделе тела типа объекта типа объекта. Раздел тела в типе объекта является необязательной частью. Если члены отсутствуют, тип объекта не будет содержать части тела.
Создать объект в Oracle
Тип объекта не может быть создан на уровне подпрограммы, они могут быть созданы только на уровне схемы. После того, как тип объекта определен в схеме, его можно использовать в подпрограммах. Тип объекта может быть создан с помощью «CREATE TYPE». Тело типа может быть создано только после создания его типа объекта.
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; /
Синтаксис Объяснение:
- Приведенный выше синтаксис показывает инициализацию экземпляра типа объекта с нулевым значением.
- Теперь сам объект не является нулевым, так как он был инициализирован, но атрибуты внутри объекта будут нулевыми, поскольку мы не присваиваем никаких значений этим атрибутам.
Конструкторы
Конструкторы — это неявный метод объекта, на который можно ссылаться с тем же именем, что и у типа объекта. Всякий раз, когда объект упоминается впервые, этот конструктор будет вызываться неявно.
Мы также можем инициализировать объекты с помощью этого конструктора. Конструктор может быть определен явно путем определения члена в теле типа объекта с тем же именем типа объекта.
Пример 1 : В следующем примере мы собираемся использовать элемент типа объекта для вставки записи в таблицу emp со значениями (‘RRR’, 1005, 20000, 1000) и (‘PPP’, 1006, 20000, 1001). После того, как данные вставлены, мы собираемся отобразить то же самое, используя элемент типа объекта. Мы также собираемся использовать явный конструктор для заполнения идентификатора менеджера по умолчанию значением 1001 для второй записи.
Мы собираемся выполнить это в следующих шагах.
- Шаг 1:
- Создать тип объекта
- Тип объекта тело
- Шаг 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 членами. Он содержит определение конструкторов только с 3 параметрами. (Фактический неявный конструктор будет содержать количество параметров, равное количеству атрибутов, присутствующих в типе объекта)
- Строка кода 10 : создание тела типа.
- Строка кода 11-21 : определение явного конструктора. Присвоение значения параметра атрибутам и присвоение значения атрибуту «manager» со значением по умолчанию «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», и значения атрибутов вставлены в таблицу.
Вывод
Имя сотрудника: RRR
Номер сотрудника: 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’, и значения атрибутов были вставлены в таблицу.
Наследование в типе объекта
Свойство наследования позволяет типу подобъекта получать доступ ко всем атрибутам и членам типа суперобъекта или типа родительского объекта.
Тип подобъекта называется типом наследуемого объекта, а тип суперобъекта называется типом родительского объекта. Синтаксис ниже показывает, как создать родительский и унаследованный тип объекта.
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. Он содержит все члены и атрибуты родительского типа объекта.
Пример 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_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
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.
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) Создание типа объекта и тела.
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) Создание анонимного блока для вызова сравнить экземпляр объекта.
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.