Какво представлява типът на обекта в PL / SQL?
Обектно-ориентираното програмиране е особено подходящо за изграждане на компоненти за многократна употреба и сложни приложения. Те са организирани около "обекти", а не "действия", т.е. програмите са предназначени да работят и да взаимодействат с целия обект, а не с едно действие. Тази концепция позволява на програмиста да попълва и манипулира детайлите на ниво обектни обекти.
Долната снимка изобразява пример за типа обект, в който банкова сметка се счита за обект. Атрибутите на обекта включват неща, които съдържат някои стойности на атрибути, например в банкова сметка; това е номер на сметка, банково салдо и т.н., докато обектните методи описват неща като изчисляване на лихвен процент, генериране на банково извлечение и т.н., което изисква да бъде завършен определен процес.
В PL / SQL обектно-ориентираното програмиране се основава на типове обекти.
Тип обект може да представлява всеки обект от реалния свят. Ще обсъдим още типове обекти в тази глава.
В този урок - ще научите,
- Компоненти на типове обекти
- Създайте обект в Oracle
- Декларация Инициализация на тип обект
- Конструктори
- Наследяване в тип обект
- Равенство на PL / SQL обекти
Компоненти на типове обекти
PL / SQL типът обект съдържа предимно два компонента.
- Атрибути
- Членове / Методи
Атрибути
Атрибутите са колоната или полето, в които се съхраняват данни. Всеки атрибут ще бъде съпоставен с типа данни, който определя типа обработка и съхранение за този атрибут. Атрибутът може да бъде от всеки валиден тип данни PL / SQL или от друг тип обект.
Членове / Методи
Членовете или Методите са подпрограми, която е дефинирана в типа обект. Те не се използват за съхранение на никакви данни. Те се използват главно за дефиниране на процес вътре в типа обект. За примери валидиране на данни преди попълване на типа обект. Те се декларират в раздела тип обект и се дефинират в раздела тяло на типа обект от типа обект. Разделът на тялото в обектния тип е незадължителна част. Ако няма членове, тогава обектният тип няма да съдържа част от тялото.
Създайте обект в Oracle
Тип обект не може да бъде създаден на ниво подпрограма, те могат да бъдат създадени само на ниво схема. След като типът обект е дефиниран в схемата, същият може да се използва в подпрограми. Типът обект може да бъде създаден с помощта на „CREATE TYPE“. Тялото на типа може да бъде създадено само след създаване на неговия тип обект.
CREATE TYPEAS OBJECT( ,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION] IS BEGIN END;… );/
Обяснение на синтаксиса:
- Горният синтаксис показва създаването на 'OBJECT' с атрибути и 'OBJECT-BODY' с методи.
- Методите могат да бъдат претоварени и в тялото на обекта.
Декларация Инициализация на тип обект
Подобно на други компоненти в PL / SQL, типовете обекти също трябва да бъдат декларирани, преди да ги използвате в програмата.
След като типът обект е създаден, той може да се използва в декларативния раздел на подпрограмата, за да декларира променлива от този тип обект.
Когато някоя променлива е декларирана в подпрограмата като тип обект, по време на изпълнение ще бъде създаден нов екземпляр от типа обект и този новосъздаден екземпляр може да бъде препратен към името на променливата. По този начин един тип обект може да съхранява множество стойности при различни екземпляри.
DECLARE;BEGIN… END;/
Обяснение на синтаксиса:
- Горният синтаксис показва декларацията на променлива като тип обект в декларативния раздел.
След като променливата бъде декларирана като тип обект в подпрограма, тя ще бъде атомално нулева, т.е. целият сам обект е нула. Трябва да се инициализира със стойности, за да ги използва в програмата. Те могат да бъдат инициализирани с помощта на конструктори.
Конструкторите са имплицитен метод на обект, който може да бъде препратен със същото име като това на типа обект. Синтаксисът по-долу показва инициализацията на типа обект.
DECLARE;BEGIN := ();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 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 : Дефиниране на изричния конструктор. Присвояване на стойността на параметъра на атрибутите и присвояване на стойността за атрибут „мениджър“ със стойността по подразбиране „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“, наречено член-функция „diplay_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 TYPEAS 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“ трябва да бъде функцията, която връща числов тип. За вход се вземат два параметъра (първи параметър: id на екземпляра на самообекта, втори параметър: id на друг екземпляр на обект).
Идентификаторът на двата обекта се сравнява и резултатът се връща в числово.
- Положителната стойност представлява, че екземплярът на 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, която сравнява атрибута „заплата“ на екземпляр 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 : Отпечатайте съобщението въз основа на номера за връщане от функцията ORDER.
Обобщение
В тази глава видяхме типа обект и техните свойства. Също така обсъдихме конструктори, членове, атрибути, наследяване и равенство в PL / SQL обекти.