Oracle Урок за PL/SQL типове обекти с ПРИМЕРИ
Какво е тип обект в PL/SQL?
Обектно-ориентираното програмиране е особено подходящо за изграждане на многократно използвани компоненти и сложни приложения. Те са организирани около „обекти“, а не „действия“, т.е. програмите са проектирани да работят и да взаимодействат с целия обект, а не с едно действие. Тази концепция позволява на програмиста да попълва и манипулира детайлите на ниво обектни обекти.
Картината по-долу изобразява пример за типа обект, в който банкова сметка се счита за обект обект. Атрибутите на обекта включват неща, които притежават стойности на някои атрибути, например в банкова сметка; това е номер на сметка, банков баланс и т.н., докато обектните методи описват неща като изчисляване на лихвен процент, генериране на банково извлечение и т.н., което изисква определен процес да бъде завършен.
В 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; /
Обяснение на синтаксиса:
- Горният синтаксис показва инициализацията на екземпляра на типа обект с нулева стойност.
- Сега самият обект не е 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 члена. Той съдържа дефиницията на конструктори само с 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 XNUMX
Мениджър: 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: Създаване на тялото за наследения тип обект.
- Кодов ред 16-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' за вмъкване на записите с id на мениджъра по подразбиране, предадено в конструктора.
Равенство на PL/SQL обекти
Екземплярът на обекта, който принадлежи към същите обекти, може да бъде сравнен за равенство. За целта трябва да имаме специалния метод в типа обект, наречен метод „ORDER“.
Този метод „ORDER“ трябва да е функцията, която връща числов тип. Той приема два параметъра като вход (първи параметър: id на екземпляра на собствения обект, втори параметър: id на друг екземпляр на обект).
Идентификаторът на двата екземпляра на обекта се сравнява и резултатът се връща в числова форма.
- Положителната стойност означава, че екземплярът на обект 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, която сравнява атрибута „заплата“ на екземпляра 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.
Oбобщение
В тази глава видяхме типа обект и техните свойства. Обсъдихме също конструктори, членове, атрибути, наследяване и равенство в PL/SQL обекти.


















