Professional Documents
Culture Documents
Principalele concepte
Conceptul de baza obiect - descrie obiecte din
comportamentul
Obiectele reprezint colecii de atribute care fac
Principalele concepte
POO presupune abilitatea de a face obiectele sa
interacioneze ntre ele Interaciunea se realizeaz prin mesaje Un mesaj transmis unui obiect este compus din 3 elemente: - Numele obiectului care conine metoda - Numele metodei - Valori pentru toi parametrii de intrare ai metodei
Principalele concepte
O clas (tip de obiecte) schema dup care este
creat un obiect Tipurile de obiecte - tipuri de date compuse definite de utilizator, prin care se definesc structura obiectului mpreun cu funciile i procedurile necesare pentru manipularea datelor:
variabilele care formeaz tipul de obiecte poart
denumirea de atribute sau proprieti; operaiile care caracterizeaz comportamentul obiectului poart denumirea de metode.
schem precizat de o clas instaniere Nu se poate crea un obiect fr a se declara clasa(schema,tipul) dup care acesta a fost
Principalele concepte
In POO trebuie respectat urmtoarea ordine
1. Crearea claselor (tipurilor)
- Precizarea denumirii atributelor, a tipului de date
Doar n momentul instanierii clasei variabilele definite de clas sunt alocate n memorie i pot fi prelucrate de ctre metode Toate obiectele unei clase suport doar metode precizate n definiia clasei
Principalele concepte
Caracteristicile fundamentale ale obiectelor, care
sunt regsite i n PL/SQL sunt: 1. ncapsularea: descrierea obiectelor se face astfel nct nu se poate avea acces din afara obiectului la datele sale; 2. Polimorfismul (evideniat prin suprancrcare): diferite obiecte pot rspunde diferit la aceleai mesaje; - Se refer la metode cu acelai nume i cu parametri de intrare/ieire diferiti - Compilatorul alege varianta corect de metod n funcie de param. de intrare furnizai - O metod poate executa aciuni diferite n funcie
Principalele concepte
3. Motenirea: capacitatea unui obiect de a-i
Principalele concepte
Structura unui tip de obiecte Oracle este
asemntoare cu cea a pachetelor de subprograme, fiind compus din dou pri 1. Specificaiile tipului de obiecte (object type specification):
- indic structura obiectului (setul de proprieti ale acestuia) i operaiile (metodele) prin care se definete comportamentul acestuia. - toate declaraiile realizate n zona de specificaii sunt publice (vizibile din afara tipului de obiecte);
Principalele concepte
2. Corpul tipului de obiecte (object type body): - implementeaz specificaiile i definete explicit metodele; - se pot realiza orice modificri n corpul tipului de obiecte, fr s fie necesar modificarea specificaiilor i fr a afecta programele de aplicaii; - corpul tipului de obiecte este opional, fiind necesar numai n cazul n care au fost declarate diverse metode n specificaii.
Principalele concepte
Restricii: n cadrul seciunii de definire a specificaiilor, toate atributele trebuie declarate naintea metodelor; dac n cadrul seciunii de definire a specificaiilor sunt declarate numai atribute, corpul tipului de obiecte nu mai este necesar; nu pot fi definite atribute ale obiectelor n corpul tipului de obiecte; toate declaraiile din zona de specificaii sunt publice; n corpul tipului de obiecte pot fi definite metode private. n cadrul sectiunii de definire a specificatiilor NU
dat;
- tipul de dat ataat atributului poate fi aproape
orice tip de dat Oracle, cu excepia tipurilor LONG, LONG ROW, NCHAR, NCLOB, NVARCHAR2, ROWID, UROWID sau a tipurilor compuse definite n cadrul pachetelor;
- n partea de specificaii, un atribut nu poate fi
comportamentul obiectelor - se declar n partea de specificaii a tipului de obiecte prin cuvntul cheie MEMBER.
Definirea unei metode se realizeaz n dou
etape:
- declararea (n partea de specificaii a tipului de
funciilor);
care se descrie comportamentul obiectelor; - metodele, ca i subprogramele din cadrul pachetelor, pot fi suprancrcate.
de obiecte existent se realizeaz n PL/SQL prin comanda ALTER, care primete diverse clauze n funcie de modificarea care se dorete a se efectua:
obiecte, chiar dac exist obiecte care depind de acesta. Dac ns tipul de obiecte a stat la baza crerii unei tabele, clauza FORCE nu va avea efect, fiind necesar ca mai nti s se tearg tabela i mai apoi tipul.
de obiecte, acesta devine vizibil n schema utilizatorului, dup cum se observ n Figura 2:
Diagrama entitate-asociere de la care se pornete n vederea realizrii obiectivului propus este prezentat mai jos. Tipurile de obiecte pot fi create i gestionate conform diagramei i a regulilor specificate n cadrul acesteia.
Dat fiind c interogrile n baza de date trebuie s se bazeze pe tabele, tipurile de obiecte pot fi cu uurin folosite pentru crearea tabelelor, astfel nct la final, n urma rafinrilor realizate, s se ajung la schema bazei de date
Exemplificri practice
Un prim exemplu evideniaz modul n care se
( strada VARCHAR2(30), numar VARCHAR2(5), cod_postal VARCHAR2(6), oras VARCHAR2(20), id_tara CHAR(2), MEMBER FUNCTION adresa_completa RETURN VARCHAR2 ); / SHOW ERRORS;
CREATE OR REPLACE TYPE BODY obj_adresa AS
MEMBER FUNCTION adresa_completa RETURN VARCHAR2 IS BEGIN RETURN (strada ||' '|| numar ||' '|| cod_postal ||' '|| oras ||' '|| id_tara); END adresa_completa; END;
Constructori
Fiecare tip de obiecte are o metod constructor,
folosit pentru iniializarea i returnarea unei instane de tipul respectiv. Constructorul are aceeai denumire ca i tipul de obiecte, iar parametrii formali ai acestuia au acelai tip cu atributele obiectului:
DECLARE
cons_1 obj_adresa; BEGIN cons_1:=obj_adresa('Bd.Unirii', '105', '012531', 'Bucuresti', 'RO'); DBMS_OUTPUT.PUT_LINE(cons_1.strada || ' ' || cons_1.numar); END; /
Constructori
Se pot defini metode constructor proprii, prin
suprancrcarea constructorului implicit sau definind noi funcii cu signatura diferit. Constructorul definit de utilizator urmrete sintaxa de mai jos, iar apelul acestuia trebuie fcut, de asemenea, n mod explicit n cadrul programului:
CONSTRUCTOR FUNCTION tip_obiect (lista_atribute)
polimorfism i se refer la faptul c pot exista mai multe definiii pentru acelai nume de metod
Constructori
Restricii la suprancrcarea metodelor: pot fi suprancrcate numai metodele de acelai tip (proceduri sau funcii); nu se pot suprancrca dou metode dac parametrii formali difer numai prin numrul sau prin tipul lor; nu se pot suprancrca dou funcii membru ce difer numai prin tipul returnat. n cazul n care tipul de obiecte obj_adresa ar fi fost definit avnd metoda constructor suprancrcat, acesta ar fi putut fi de forma urmtoare (pentru simplificarea exemplificrii s-a considerat drept valoare implicit pentru codul arii - RO):
(..............., CONSTRUCTOR FUNCTION obj_adresa (p_strada VARCHAR2, p_numar VARCHAR2, p_codp VARCHAR2, p_oras VARCHAR2) RETURN SELF AS RESULT ); CREATE OR REPLACE TYPE BODY obj_adresa AS CONSTRUCTOR FUNCTION obj_adresa (p_strada VARCHAR2, p_numar VARCHAR2, p_codp VARCHAR2, p_oras VARCHAR2) RETURN SELF AS RESULT IS BEGIN SELF.strada:=p_strada; SELF.numar:=p_numar; SELF.cod_postal:=p_codp; SELF.oras:=p_oras; SELF.id_tara:='RO'; RETURN; END; ............. END;
respectiv cea definit de utilizator prin suprancrcare, este evideniat n blocul PL/SQL de mai jos, care le apeleaz:
DECLARE cons_1 obj_adresa; cons_2 obj_adresa; BEGIN cons_1:=obj_adresa('Str.Lunga', '10', '012531', 'Brasov', 'RO'); DBMS_OUTPUT.PUT_LINE(cons_1.strada || ' ' || cons_1.numar|| ' ' || cons_1.cod_postal|| ' ' || cons_1.oras|| ' ' || cons_1.id_tara); cons_2:=obj_adresa('Bd.Unirii', '105', '012531', 'Bucuresti'); DBMS_OUTPUT.PUT_LINE(cons_2.strada || ' ' || cons_2.numar|| ' ' || cons_2.cod_postal|| ' ' || cons_2.oras|| ' ' || cons_2.id_tara); END;
Execuia blocului anterior duce la afiarea celor dou instanieri ale tipului de obiecte creat Str.Lunga 10 012531 Brasov RO Bd.Unirii 105 012531 Bucuresti RO
Obiecte neiniializate
Pn n momentul iniializrii unui obiect prin apelul constructorului, obiectul n
sine este Null (nu doar atributele sale). 2 obiecte null nu sunt niciodata egale, rezultatul comparrii lor fiind Null. De asemenea asignarea unui obiect null altui obiect l va transforma i pe acesta n null si va trebui reiniializat
DECLARE Adresa obj_adresa; -- obiectul adresa este null BEGIN IF adresa IS NULL THEN DBMS_OUTPUT.PUT_LINE('adresa is NULL #1'); END IF; IF adresa.strada IS NULL THEN DBMS_OUTPUT.PUT_LINE(adresa.strada is NULL #1'); END IF; adresa.strada:=rotunda; IF adresa IS NULL THEN DBMS_OUTPUT.PUT_LINE('adresa is NULL #2'); END IF; IF adresa.strada IS NULL THEN DBMS_OUTPUT.PUT_LINE(adresa.strada is NULL #2'); END IF; END
folosit pentru crearea unei tabele bazat pe tipul de obiecte. O linie din tabela de obiecte are un identificator de obiect i servete ca referin la obiectul respectiv. CREATE TABLE nume_tabela OF tip_obiect; -creare tabel de obiecte
valorilor implicite prin clauza DEFAULT nu pot fi ataate atributelor unui tip de obiecte, ns n cazul n care ntr-o tabel creat pe baza tipului este nevoie ca atributele s conin aceste restricii ele pot fi aplicate ulterior, urmnd sintaxa: CREATE TABLE nume_tabela OF tip_obiect ( CONSTRAINT .......... --definire restricii de integritate asupra atributelor );
Exemplificari practice
n exemplul de mai jos, tabela autentificare este creat pornind
de la tipul de obiecte obj_autentificare. Ca atare, tabela nou creat are drept atribute proprietile tipului de obiecte, username i parola, iar metoda verifica_user poate fi folosit pentru manipularea ulterioar a coninutului tabelei. n plus, celor dou atribute ale tabelei li se ataeaz restricii suplimentare de tip NOT NULL, independente de tipul de obiecte pornind de la care se realizeaz crearea tabelei: CREATE OR REPLACE TYPE obj_autentificare AS OBJECT ( username VARCHAR2(20), parola VARCHAR2(20) );
CREATE TABLE autentificare OF obj_autentificare ( CONSTRAINT nn_user CHECK (username IS NOT NULL), CONSTRAINT nn_parola CHECK (parola IS NOT NULL) );
obiectelor, regsit i n PL/SQL este motenirea tipurilor, reprezentnd capacitatea unui tip de obiecte de a-i deriva datele i funcionalitatea dintr-un altul. Supertipul (tipul printe) de obiecte va avea precizat clauza NOT FINAL, ceea ce permite derivarea subtipurilor din acesta. Subtipul (tipul fiu) de obiecte conine toate atributele i metodele tipului parinte, ns poate conine i atribute i metode suplimentare care pot suprancrca metodele tipului parinte.
NOT FINAL; T2
--supertip pentru
este definit ca fiind supertip (tip printe). Se utilizeaz tipuri imbricate de obiecte, atributele date_login i adresa avnd asociate drept tipuri de date tipurile de obiecte definite anterior. Metodele definite n tipurile de obiecte imbricate sunt accesibile n continuare i la manipularea tipului obj_utilizatori:
obj_utilizatori AS OBJECT ( id_user NUMBER(3), cnp CHAR(13), nume VARCHAR2(20), email VARCHAR2(20), date_login obj_autentificare, adresa obj_adresa, MEMBER FUNCTION verifica_email(p NUMBER) RETURN BOOLEAN, MEMBER FUNCTION verifica_cnp(p NUMBER) RETURN BOOLEAN ) NOT FINAL;
CREATE TABLE utilizatori OF
IF v_email LIKE '%@%.%' THEN RETURN true; ELSE RETURN false; END IF; END verifica_email; MEMBER FUNCTION verifica_cnp(p NUMBER) RETURN BOOLEAN IS v_cnp utilizatori.cnp%TYPE; BEGIN SELECT cnp INTO v_cnp FROM utilizatori WHERE id_user=p; IF SUBSTR(v_cnp,1,1) IN (1,2) THEN IF SUBSTR(v_cnp,4,2) BETWEEN '01' AND '12' THEN IF SUBSTR(v_cnp,6,2) BETWEEN '01' AND '31' THEN RETURN true; ELSE RETURN false; END IF; ELSE RETURN false; END IF; ELSE RETURN false; END IF; END verifica_cnp; END;
obj_utilizatori;
CREATE OR REPLACE TYPE BODY
obj_utilizatori AS MEMBER FUNCTION verifica_email(p NUMBER) RETURN BOOLEAN IS v_email utilizatori.email%TYPE; BEGIN SELECT email INTO v_email FROM utilizatori WHERE id_user=p;
MEMBER PROCEDURE adauga_cursant IS v_id cursanti.id_user%TYPE; BEGIN SELECT NVL(MAX(id_user),0)+ 1 INTO v_id FROM cursanti; INSERT INTO cursanti VALUES (v_id, cnp, nume, email, date_login, adresa, data_nastere); END adauga_cursant;
MEMBER PROCEDURE sterge_cursant IS v_id cursanti.id_user%TYPE; BEGIN IF v_id IS NULL THEN DELETE FROM cursanti; ELSE DELETE FROM cursanti WHERE id_user=v_id; END IF; END sterge_cursant; END;
n cadrul comenzilor SQL de manipulare a datelor: comanda de interogare, respectiv cele de actualizare. Pentru specificarea valorilor unui obiect se vor folosi constructorul implicit sau cel suprancrcat, definit de utilizator. Referirea atributelor unui obiect se realizeaz prin prefixarea acestora cu numele obiectului Exercitii
metodele incluse, tabelele create pe baza obiectelor pot fi vizualizate prin interogarea dicionarului de date, prin intermediul tabelelor virtuale predefinite: user_types, user_object_tables, user_type_methods, user_method_results, user_method_params, user_source.
SELECT * FROM user_source WHERE LOWER(type)='type body' AND LOWER(name)='obj_adresa'; SELECT * FROM user_object_tables; SELECT type_name, supertype_name FROM user_types;