Ce este tipul de obiect în PL / SQL?
Programarea orientată pe obiecte este potrivită în special pentru construirea de componente refolosibile și aplicații complexe. Ele sunt organizate în jurul „obiectelor” mai degrabă decât „acțiunilor”, adică programele sunt proiectate să funcționeze și să interacționeze cu întregul obiect, mai degrabă decât cu acțiunea unică. 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 unele valori ale atributelor, de exemplu în Cont bancar; este numărul contului, soldul băncii etc., în timp ce metodele obiecte descriu lucruri precum calcularea ratei dobânzii, generarea extrasului bancar etc., care necesită finalizarea anumitor procese.
Î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.
În acest tutorial - veți învăța,
- Componentele tipurilor de obiecte
- Creați obiect în Oracle
- Declarație Inițializarea tipului de obiect
- Constructori
- Moștenirea în tipul de obiect
- Egalitatea obiectelor PL / SQL
Componentele tipurilor de obiecte
Tipul de obiect PL / SQL 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 tip de date PL / SQL valid sau poate fi de alt tip de obiect.
Membri / Metode
Membrii sau metodele sunt subprograme definite în tipul de obiect. Nu sunt folosite pentru a stoca date. Ele sunt utilizate în principal pentru a defini procesul din interiorul tipului de obiect. Pentru exemple de validare a datelor înainte de completarea tipului de obiect. Acestea sunt declarate în secțiunea de tip obiect și definite în secțiunea corp de tip 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, pot fi create numai la nivel de schemă. Odată ce tipul de obiect este definit în schemă, atunci același lucru poate fi folosit în subprograme. Tipul de obiect poate fi creat folosind „CREARE TIP”. Corpul tipului poate fi creat numai după crearea tipului său de obiect.
CREATE TYPEAS OBJECT( ,… );/CREATE TYPE BODY AS OBJECT(MEMBER[PROCEDURE|FUNCTION] IS BEGIN END;… );/
Sintaxă Explicație:
- Sintaxa de mai sus arată crearea „OBJECT” cu atribute și „OBJECT-BODY” cu metode.
- Metodele pot fi, de asemenea, supraîncărcate în corpul obiectului.
Declarație Inițializarea tipului de obiect
La fel ca alte componente din PL / SQL, sunt necesare și tipuri de obiecte care trebuie declarate înainte de a le utiliza în program.
Odată ce tipul de obiect este creat, acesta poate fi utilizat în secțiunea declarativă a subprogramului pentru a declara o variabilă a acelui tip de obiect.
Ori de câte ori o variabilă este declarată în subprogram ca tip de obiect, în timpul rulării va fi creată o nouă instanță de tipul obiectului, 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;BEGIN… END;/
Sintaxă Explicație:
- Sintaxa de mai sus arată declarația 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 atomică nulă, adică întregul obiect în sine va fi nul. Trebuie inițializat cu valori pentru a le utiliza în program. Pot fi inițializate folosind constructori.
Constructorii sunt metoda implicită a unui obiect care poate fi menționat cu același nume ca cel al tipului de obiect. Sintaxa de mai jos arată inițializarea tipului de obiect.
DECLARE;BEGIN := ();END;/
Sintaxă Explicație:
- Sintaxa de mai sus arată inițializarea instanței de tip obiect cu o valoare nulă.
- Acum obiectul în sine nu este nul așa cum 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 menționat cu același nume ca cel al tipului de obiect. Ori de câte ori obiectul este trimis pentru prima dată, acest constructor va fi chemat implicit.
De asemenea, putem inițializa obiectele folosind acest constructor. Constructorul poate fi definit în mod explicit definind membrul în corpul de tip obiect cu același nume al tipului de obiect.
Exemplul 1 : În exemplul următor vom folosi membrul de tip obiect pentru a insera înregistrarea în tabela emp cu valori ('RRR', 1005, 20000, 1000) și ('PPP', 1006, 20000, 1001). Odată ce datele sunt inserate, vom afișa aceleași folosind membrul de tip obiect. De asemenea, vom folosi constructorul explicit pentru a completa implicit ID-ul managerului cu valoarea 1001 pentru a doua înregistrare.
O vom executa în pașii de mai jos.
- Pasul 1:
- Creați un tip de obiect
- Corp de tip obiect
- 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.
Pasul 1) Creați tipul de obiect și corpul tipului de obiect
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:/
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 numărul de parametri egal cu numărul de atribute prezente în tipul de obiect)
- Linia de cod 10 : Crearea corpului tipului.
- 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' în care afișarea valorilor atributelor de tip obiect.
Ieșire
Tipul creat
Tipul corpului a fost creat
Pasul 2) Crearea unui bloc anonim pentru a apela tipul de obiect creat prin constructorul implicit pentru 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;
Explicarea codului
- Linia de cod 37-45 : Introducerea înregistrărilor folosind constructorul implicit. Apelul către constructor conține numărul real de valori ale atributelor.
- Linia de cod 38 : declară 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 valorile atributelor sunt afișate
- Linia de cod 42 : Instrucțiunea „guru_emp_det.insert_records” numită funcția membru „insert_records” și valorile atributelor sunt inserate în tabel.
Ieșire
Numele angajatului: RRR
Număr angajat: 1005
Salariu: 20000
Manager: 1000
Pasul 3) Crearea unui bloc anonim pentru a apela tipul de obiect creat prin constructorul explicit pentru 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;/
Ieșire
Employee Name:PPPEmployee Number:1006Salary:20000Manager:1001
Explicatie cod:
- Linia de cod 46-53 : Introducerea înregistrărilor folosind constructorul explicit.
- Linia de cod 46 : declară 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 : Instrucțiunea „guru_emp_det.insert_records” numită funcția membru „insert_records” și valorile atributelor sunt inserate în tabel.
Moștenirea în tipul de obiect
Proprietatea moștenire permite tipului de sub-obiect să acceseze toate atributele și membrii tipului de obiect super sau a tipului de obiect părinte.
Tipul de sub-obiect se numește tip de obiect moștenit, iar tipul de obiect super 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 TYPEAS OBJECT( ,… )NOT FINAL;/
Sintaxă Explicație:
- Sintaxa de mai sus arată crearea tipului SUPER.
CREATE TYPEUNDER ( ,.);/
Sintaxă Explicație:
- Sintaxa de mai sus arată crearea de tip SUB. Conține toți membrii și atributele din tipul de obiect părinte.
Exemplul 1: În exemplul de mai jos, vom folosi proprietatea de moștenire pentru a insera înregistrarea cu ID-ul managerului ca „1002” pentru următoarea înregistrare („RRR”, 1007, 20000).
Vom executa programul de mai sus în pașii următori
- Pasul 1: Creați tip SUPER.
- Pasul 2: Creați tipul și corpul SUB.
- Pasul 3: Crearea unui bloc anonim pentru a apela tipul SUB.
Pasul 1) Creați tip SUPER sau tip 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;/
Explicatie cod:
- 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 „NU FINAL”, deci este de tip părinte.
Pasul 2) Creați tip SUB sub tip 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;/
Explicatie cod:
- Linia de cod 10-13 : Crearea sub_emp_object ca tip moștenit cu un atribut suplimentar „default_manager” și declarația procedurii de membru.
- Linia de cod 14 : Crearea corpului pentru tipul de obiect moștenit.
- Linia de cod 1 6 -21 : Definirea procedurii de membru care inserează înregistrările în tabelul „emp” cu valorile din tipul de obiect „SUPER”, cu excepția valorii managerului. Pentru valoarea managerului, folosește „default_manager” din tipul „SUB”.
Pasul 3) Crearea unui bloc anonim pentru a apela tipul 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;/
Explicatie cod:
- 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 pentru atributul default_manager
- Linia de cod 28 : Apelarea membrului 'insert_default_mgr' pentru a insera înregistrările cu ID-ul managerului implicit trecut în constructor.
Egalitatea obiectelor PL / SQL
Instanța de obiect 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ă „COMANDĂ” ar trebui să fie funcția care returnează tipul numeric. Ia doi parametri ca intrare, (primul parametru: id-ul instanței de auto-obiect, al doilea parametru: id-ul unei alte instanțe de obiect).
ID-ul instanței celor două obiecte este comparat, iar rezultatul este returnat numeric.
- Valoarea pozitivă reprezintă faptul că instanța obiect SELF este mai mare decât o altă instanță.
- Valoarea negativă reprezintă faptul că instanța obiect SELF este mai mică decât o altă instanță.
- Zero reprezintă faptul că instanța obiect SELF este egală cu o altă instanță.
- Dacă oricare dintre instanțe este nulă, atunci această funcție va reveni nulă.
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;… );/
Sintaxă Explicație:
- 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 obiect_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 doi pași.
- Pasul 1: Crearea tipului și corpului obiectului.
- Pasul 2: Crearea blocului anonim pentru apelare comparați instanța obiectului.
Pasul 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 ASORDER MEMBER FUNCTION equals(c emp_object_equality)RETURN INTEGERISBEGIN IF salaryc.salaryTHEN RETURN 1;ELSERETURN 0;END IF: END;END;/
Explicatie cod:
- 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 de parametru. Revine negativ dacă salariul SELF este mai mic sau pozitiv dacă salariul SELF este mai mare și 0 dacă salariile sunt egale.
Ieșire cod:
Tipul creat
Pasul 2) Crearea blocului anonim pentru apelare comparați instanța obiectului.
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;/
Ieșire
Salary of second instance is greater
Explicatie cod:
- 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 : Inițializarea l_obj_1 cu valoarea salariului „15000”
- Linia de cod 24 : Inițializarea l_obj_1 cu valoarea salariului „17000”
- Linia de cod 25-33 : Imprimați mesajul pe baza numărului de retur din funcția ORDER.
rezumat
În acest capitol, am văzut tipul obiectului și proprietățile acestora. De asemenea, am discutat despre constructori, membri, atribute, moștenire și egalitate în obiectele PL / SQL.