Oracle Tutorial Tipuri de Obiecte PL/SQL cu EXEMPLE
Ce este tipul de obiect รฎn PL/SQL?
Programarea orientatฤ pe obiecte este potrivitฤ รฎn special pentru construirea de componente reutilizabile ศi aplicaศii complexe. Ele sunt organizate รฎn jurul โobiectelorโ mai degrabฤ decรขt รฎn โโโacศiuniโ, adicฤ programele sunt proiectate sฤ funcศioneze ศi sฤ interacศioneze cu รฎntregul obiect, mai degrabฤ decรขt cu o singurฤ acศiune. Acest concept permite programatorului sฤ populeze ศi sฤ manipuleze detaliile la nivel de entitฤศi obiect.
Imaginea de mai jos prezintฤ un exemplu de tip de obiect รฎn care un cont bancar este considerat o entitate obiect. Atributele obiectului includ lucruri care deศin anumite valori de atribut, de exemplu รฎn contul bancar; este numฤrul de cont, soldul bancar etc., รฎn timp ce metodele obiect descriu lucruri precum calcularea ratei dobรขnzii, generarea extrasului bancar etc., care necesitฤ finalizarea unui anumit proces.
รn PL/SQL programarea orientatฤ pe obiecte se bazeazฤ pe tipuri de obiecte.
Un tip de obiect poate reprezenta orice entitate din lumea realฤ. Vom discuta mai multe tipuri de obiecte รฎn acest capitol.
Componentele tipurilor de obiecte
PL / SQL tipul de obiect conศine รฎn principal douฤ componente.
- Atribute
- Membri/Metode
Atribute
Atributele sunt coloana sau cรขmpul รฎn care sunt stocate datele. Fiecare atribut va fi mapat la tipul de date care defineศte tipul de procesare ศi stocare pentru acel atribut. Atributul poate fi de orice valid Tip de date PL/SQL, sau poate fi de alt tip de obiect.
Membri/Metode
Membrii sau Metodele sunt subprograme care sunt definite รฎn tipul de obiect. Ele nu sunt folosite pentru a stoca date. Ele sunt utilizate รฎn principal pentru a defini procesele รฎn interiorul tipului de obiect. Pentru exemple de validare a datelor รฎnainte de popularea tipului de obiect. Ele sunt declarate รฎn secศiunea tip de obiect ศi definite รฎn secศiunea de corp a tipului de obiect a tipului de obiect. Secศiunea corpului รฎn tipul obiectului este o parte opศionalฤ. Dacฤ nu sunt prezenศi membri, atunci un tip de obiect nu va conศine nicio parte a corpului.
Creaศi obiect รฎn Oracle
Un tip de obiect nu poate fi creat la nivel de subprogram, ele pot fi create doar la nivel de schemฤ. Odatฤ ce tipul de obiect este definit รฎn schemฤ, atunci acelaศi lucru poate fi utilizat รฎn subprograme. Tipul de obiect poate fi creat folosind โCREATE TYPEโ. Corpul tipului poate fi creat numai dupฤ crearea tipului sฤu de obiect.
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;โญ . . โฌ ); /
Explicaศia sintaxei:
- Sintaxa de mai sus aratฤ crearea lui โOBJECTโ cu atribute ศi โOBJECT-BODYโ cu metode.
- Metodele pot fi, de asemenea, supraรฎncฤrcate รฎn corpul obiectului.
Declaraศia de iniศializare a tipului de obiect
Ca ศi alte componente din PL/SQL, tipurile de obiecte trebuie, de asemenea, sฤ fie declarate รฎnainte de a le utiliza รฎn program.
Odatฤ ce tipul de obiect este creat, acesta poate fi folosit รฎn secศiunea declarativฤ a subprogramului pentru a declara o variabilฤ a acelui tip de obiect.
Ori de cรขte ori orice variabilฤ este declaratฤ รฎn subprogram ca tip de obiect, รฎn timpul execuศiei va fi creatฤ o nouฤ instanศฤ a tipului de obiect, iar aceastฤ instanศฤ nou creatฤ poate fi referitฤ la numele variabilei. รn acest fel, un singur tip de obiect poate stoca mai multe valori รฎn instanศe diferite.
DECLARE <variable_name> <object_type_name>; BEGIN . . END; /
Explicaศia sintaxei:
- Sintaxa de mai sus aratฤ declararea unei variabile ca tip de obiect รฎn secศiunea declarativฤ.
Odatฤ ce variabila este declaratฤ ca tip de obiect รฎntr-un subprogram, aceasta va fi nulฤ atomic, adicฤ รฎntregul obiect รฎn sine este nul. Trebuie iniศializat cu valori pentru a le utiliza รฎn program. Ele pot fi iniศializate folosind constructori.
Constructorii sunt metoda implicitฤ a unui obiect care poate fi referitฤ cu acelaศi nume cu cel al tipului de obiect. Sintaxa de mai jos aratฤ iniศializarea tipului de obiect.
DECLARE <variable_name> <object_type_name>; BEGIN <variable_name>:=<object_type_name>(); END; /
Explicaศia sintaxei:
- Sintaxa de mai sus aratฤ iniศializarea instanศei tip obiect cu o valoare nulฤ.
- Acum obiectul รฎn sine nu este nul, deoarece a fost iniศializat, dar atributele din interiorul obiectului vor fi nule deoarece nu am atribuit nicio valoare acestor atribute.
Constructori
Constructorii sunt metoda implicitฤ a unui obiect care poate fi referitฤ cu acelaศi nume cu cel al tipului de obiect. Ori de cรขte ori obiectul este referit pentru prima datฤ, acest constructor va fi apelat implicit.
De asemenea, putem iniศializa obiectele folosind acest constructor. Constructorul poate fi definit รฎn mod explicit prin definirea membrului รฎn corpul tipului de obiect cu acelaศi nume cu tipul de obiect.
Exemplu 1: รn exemplul urmฤtor vom folosi membrul tip obiect pentru a insera รฎnregistrarea รฎn tabelul emp cu valori ('RRR', 1005, 20000, 1000) ศi ('PPP', 1006, 20000, 1001). Odatฤ ce datele sunt inserate, vom afiศa acelaศi lucru folosind membru de tip obiect. De asemenea, vom folosi constructorul explicit pentru a popula ID-ul managerului รฎn mod implicit cu valoarea 1001 pentru a doua รฎnregistrare.
รl vom executa รฎn paศii de mai jos.
- Step1:
- Creaศi tip de obiect
- Corpul tipului obiectului
- Pasul 2: Crearea unui bloc anonim pentru a apela tipul de obiect creat prin constructorul implicit pentru emp_no 1005.
- Pasul 3: Crearea unui bloc anonim pentru a apela tipul de obiect creat prin constructorul explicit pentru emp_no 1006.
Pas 1) Creaศi tipul obiectului ศi corpul tipului obiectului
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:
/
Explicarea codului
- Linia de cod 1-9: Crearea tipului de obiect โemp_objectโ cu 4 atribute ศi 3 membri. Conศine definiศia constructorilor cu doar 3 parametri. (Constructorul implicit real va conศine un numฤr de parametri egal cu numฤrul de atribute prezente รฎn tipul de obiect)
- Linia de cod 10: Crearea corpului de tip.
- Linia de cod 11-21: Definirea constructorului explicit. Atribuirea valorii parametrului atributelor ศi atribuirea valorii pentru atributul โmanagerโ cu valoarea implicitฤ โ1001โ.
- Linia de cod 22-26: Definirea membrului โinsert_recordsโ รฎn care valorile atributelor sunt inserate รฎn tabelul โempโ.
- Linia de cod 27-34: Definirea membrului 'display_records' in care se afiseaza valorile atributelor tip obiect.
producศie
Tip creat
Tip body creat
Pas 2) Crearea unui bloc anonim pentru a apela tipul de obiect creat prin constructorul implicit pentru 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;
Explicarea codului
- Linia de cod 37-45: Inserarea รฎnregistrฤrilor folosind constructorul implicit. Apelul la constructor conศine numฤrul real de valori ale atributelor.
- Linia de cod 38: Declara guru_emp_det ca tip de obiect al โemp_objectโ.
- Linia de cod 41: Declaraศia โguru_emp_det.display_recordsโ numitฤ funcศia membru โdiplay_recordsโ ศi sunt afiศate valorile atributelor
- Linia de cod 42: Declaraศia โguru_emp_det.insert_recordsโ numitฤ funcศia membru โinsert_recordsโ ศi valorile atributelor sunt inserate รฎn tabel.
producศie
Numele angajatului: RRR
Numฤr de angajat: 1005
Salariu: 20000
Manager: 1000
Pas 3) Crearea unui bloc anonim pentru a apela tipul de obiect creat prin constructorul explicit pentru 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; /
producศie
Employee Name:PPP Employee Number:1006 Salary:20000 Manager:1001
Explicaศia codului:
- Linia de cod 46-53: Inserarea รฎnregistrฤrilor folosind constructorul explicit.
- Linia de cod 46: Declara guru_emp_det ca tip de obiect al โemp_objectโ.
- Linia de cod 50: Declaraศia โguru_emp_det.display_recordsโ numitฤ funcศia membru โdisplay_recordsโ ศi sunt afiศate valorile atributelor
- Linia de cod 51: Declaraศia โguru_emp_det.insert_recordsโ numitฤ funcศia membru โinsert_recordsโ ศi valorile atributelor sunt inserate รฎn tabel.
Moศtenirea รฎn tipul obiectului
Proprietatea de moศtenire permite tipului de sub-obiect sฤ acceseze toate atributele ศi membrii tipului de super obiect sau tipului de obiect pฤrinte.
Tipul de sub-obiect se numeศte tip de obiect moศtenit, iar tipul de super obiect se numeศte tip de obiect pฤrinte. Sintaxa de mai jos aratฤ cum sฤ creaศi tipul de obiect pฤrinte ศi moศtenit.
CREATE TYPE <object_type_name_parent> AS OBJECT ( <attribute_l><datatype>, . . )NOT FINAL; /
Explicaศia sintaxei:
- Sintaxa de mai sus aratฤ crearea tipului SUPER.
CREATE TYPE<object_type_name_sub>UNDER<object_type_name_parent> ( <attribute_l><datatype>, . ); /
Explicaศia sintaxei:
- Sintaxa de mai sus aratฤ crearea tipului SUB. Conศine toศi membrii ศi atributele din tipul de obiect pฤrinte.
Example1: รn exemplul de mai jos, vom folosi proprietatea de moศtenire pentru a insera รฎnregistrarea cu ID manager ca โ1002โ pentru urmฤtoarea รฎnregistrare (โRRRโ, 1007, 20000).
Vom executa programul de mai sus รฎn urmฤtorii paศi
- Pasul 1: Creaศi tipul SUPER.
- Pasul 2: Creaศi tipul ศi corpul SUB.
- Pasul 3: Crearea unui bloc anonim pentru a apela tipul SUB.
Pas 1) Creaศi tipul SUPER sau tipul Pฤrinte.
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; /
Explicaศia codului:
- Linia de cod 1-9: Crearea tipului de obiect โemp_objectโ cu 4 atribute ศi 3 membri. Conศine definiศia constructorilor cu doar 3 parametri. A fost declarat ca โNU FINALโ, deci este de tip pฤrinte.
Pas 2) Creaศi tipul SUB sub tipul 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; /
Explicaศia codului:
- Linia de cod 10-13: Crearea sub_emp_object ca tip moศtenit cu un atribut suplimentar โdefault_managerโ ศi declaraศie de procedurฤ membru.
- Linia de cod 14: Crearea corpului pentru tipul de obiect moศtenit.
- Linia de cod 16-21: Definirea procedurii de membru care este inserarea รฎnregistrฤrilor รฎn tabelul โempโ cu valorile din tipul de obiect โSUPERโ, cu excepศia valorii manager. Pentru valoarea de manager, foloseศte โdefault_managerโ din tipul โSUBโ.
Pas 3) Crearea unui bloc anonim pentru a apela tipul 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; /
Explicaศia codului:
- Linia de cod 25: Declararea โguru_emp_detโ ca tip โsub_emp_objectโ.
- Linia de cod 27: Iniศializarea obiectului cu constructorul implicit. Constructorul are 5 parametri (4 atribute de tip PARENT ศi 2 atribute de tip SUB). Ultimul parametru (1002) defineศte valoarea atributului default_manager
- Linia de cod 28: Apelarea membrului โinsert_default_mgrโ pentru a insera รฎnregistrฤrile cu id-ul de manager implicit transmis รฎn constructor.
Egalitatea obiectelor PL/SQL
Instanศa obiectului care aparศine aceloraศi obiecte poate fi comparatฤ pentru egalitate. Pentru aceasta, trebuie sฤ avem metoda specialฤ รฎn tipul de obiect numitฤ metoda โORDERโ.
Aceastฤ metodฤ โORDERโ ar trebui sฤ fie funcศia care returneazฤ tipul numeric. Este nevoie de doi parametri ca intrare (primul parametru: id-ul instanศei auto-obiect, al doilea parametru: id-ul altui obiect al instanศei).
Id-ul celor douฤ instanศe de obiect este comparat, iar rezultatul este returnat numeric.
- Valoarea pozitivฤ reprezintฤ faptul cฤ instanศa obiectului SELF este mai mare decรขt o altฤ instanศฤ.
- Valoarea negativฤ reprezintฤ cฤ instanศa obiectului SELF este mai micฤ decรขt o altฤ instanศฤ.
- Zero reprezintฤ cฤ instanศa obiectului SELF este egalฤ cu o altฤ instanศฤ.
- Dacฤ oricare dintre instanศe este nulฤ, atunci aceastฤ funcศie va returna nul.
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;
.
.
);
/
Explicaศia sintaxei:
- Sintaxa de mai sus aratฤ funcศia ORDER care trebuie inclusฤ รฎn corpul tipului pentru verificarea egalitฤศii.
- Parametrul pentru aceastฤ funcศie ar trebui sฤ fie o instanศฤ de acelaศi tip de obiect.
- Funcศia de mai sus poate fi numitฤ โobj_instance_1.match(obj_instance_2)โ ศi aceastฤ expresie va returna valoarea numericฤ aศa cum se aratฤ, unde obj_instance_1 ศi obj_instance_2 sunt instanศa obiectului_type_name.
Exemplul 1: รn exemplul urmฤtor vom vedea cum sฤ comparฤm douฤ obiecte. Vom crea douฤ instanศe ศi vom compara atributul โsalariuโ รฎntre ele. Vom face รฎn doi paศi.
- Pasul 1: Crearea tipului ศi corpului obiectului.
- Pasul 2: Crearea blocului anonim pentru a apela compararea instanศei obiectului.
Pas 1) Crearea tipului ศi corpului obiectului.
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; /
Explicaศia codului:
- Linia de cod 1-4: Crearea tipului de obiect โemp_object_equalityโ cu 1 atribute ศi 1 membru.
- Linia de cod 6-16: Definirea funcศiei ORDER care comparฤ atributul โsalariuโ al instanศei SELF ศi tipul instanศei parametrului. Se รฎntoarce negativ dacฤ salariul SELF este mai mic sau pozitiv dacฤ salariul SELF este mai mare ศi 0 dacฤ salariile sunt egale.
Ieศire cod:
Tip creat
Pas 2) Crearea blocului anonim pentru a apela compara instanศa obiectului.
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; /
producศie
Salary of second instance is greater
Explicaศia codului:
- Linia de cod 20: Declararea l_obj_1 de tip emp_object_equality.
- Linia de cod 21: Declararea l_obj_2 de tip emp_object_equality.
- Linia de cod 23: Se iniศializeazฤ l_obj_1 cu valoarea salariului ca โ15000โ
- Linia de cod 24: Se iniศializeazฤ l_obj_1 cu valoarea salariului ca โ17000โ
- Linia de cod 25-33: Tipฤriศi mesajul pe baza numฤrului de retur din funcศia COMANDฤ.
Rezumat
รn acest capitol, am vฤzut tipul de obiect ศi proprietฤศile acestora. Am mai discutat despre constructori, membri, atribute, moศtenire ศi egalitate รฎn obiectele PL/SQL.


















