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.