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.

Tipuri de obiecte รฎn PL/SQL

รŽ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.

  1. Atribute
  2. 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.

Creaศ›i obiect รฎn OracleCreaศ›i obiect รฎn Oracle

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.

Declaraศ›ia de iniศ›ializare a tipului de obiect

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.

Declaraศ›ia de iniศ›ializare a 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

Constructori

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

Constructori

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

Constructori

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

Constructori

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.

Moศ™tenirea รฎn tipul obiectului

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

Explicaศ›ia sintaxei:

  • Sintaxa de mai sus aratฤƒ crearea tipului SUPER.

Moศ™tenirea รฎn tipul obiectului

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.

Moศ™tenirea รฎn tipul 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(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.

Moศ™tenirea รฎn tipul obiectului

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

Moศ™tenirea รฎn tipul obiectului

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.

Egalitatea obiectelor 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;
  .
  .
);
/

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.

Egalitatea obiectelor PL/SQL

Egalitatea obiectelor 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;
/

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.

Egalitatea obiectelor 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;
/

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.

Rezumaศ›i aceastฤƒ postare cu: