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.