You are on page 1of 39

Modul de utilizare a facilitii obiectuale a PL/SQL

Principalele concepte
Conceptul de baza obiect - descrie obiecte din

lumea reala Obiectele sunt caracterizate de


- Atribute proprieti - Metode operaii care caracterizeaz

comportamentul
Obiectele reprezint colecii de atribute care fac

referire la aceeai entitate. Fiecare obiect este caracterizat prin:


numele prin care este referit; un identificator unic atribuit de sistem; o implementare care este privat;

o interfa care este public.

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.

Operaia prin care este creat un obiect dup o

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

suportat,etc - Precizarea signaturii metodelor componente, a corpului lor,etc


2. Crearea obiectelor

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

deriva datele i funcionalitatea din alt obiect.


Se permite construirea unor clase de baz, cu rolul de a stoca caracteristici comune unor clase diferite, astfel c aceste proprieti nu vor trebui precizate n fiecare clas n parte Motenirea este posibil i pe mai multe niveluri n urma motenirii clasa derivat nu copiaz propr. clasei de baz ci acestea i sunt direct accesibile Clasa derivat poate redefini metode ale clasei

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

Crearea unui tip de obiecte Oracle


CREATE [OR REPLACE] TYPE nume_tip IS|AS OBJECT (atribut1 tip_de_dat, atribut2 tip_de_dat, ...... [MEMBER procedure/function, --declarare metode MEMBER procedure/function, ..] ); CREATE [OR REPLACE] TYPE BODY nume_tip IS|AS [MEMBER procedure/function, --definirea corpului metodelor MEMBER procedure/function, ..];

Crearea unui tip de obiecte Oracle


La definirea atributelor obiectelor trebuie

respectate o serie de reguli:


- un atribut trebuie s aib un nume i un tip de

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

Crearea unui tip de obiecte Oracle


Metodele
- subprograme prin care se observ

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

obiecte), - definirea extins a corpului acesteia (n corpul tipului de obiecte)

Crearea unui tip de obiecte Oracle


Regulile care trebuie ndeplinite la definirea unei metode:
- numele unei metode trebuie s fie unic; - specificaiile unei metode constau n:
- numele acesteia, - lista parametrilor - eventual, tipul de dat returnat (n cazul

funciilor);

- corpul metodei const n codul PL/SQL prin

care se descrie comportamentul obiectelor; - metodele, ca i subprogramele din cadrul pachetelor, pot fi suprancrcate.

Modificarea unui tip de obiecte Oracle


Modificarea atributelor i metodelor unui tip

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:

ALTER TYPE tip_obiect ADD ATTRIBUTE (nume1 tip1, ) CASCADE;

ALTER TYPE tip_obiect

DROP ATTRIBUTE nume1, .. ;

Stergerea unui tip de obiecte Oracle


tergerea unui tip de obiecte se realizeaz

prin comanda DROP:


DROP TYPE tip_obiect [ FORCE ];
Clauza FORCE indic tegerea tipului de

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.

n urma crerii unui tip

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

pot crea tipuri simple de obiecte.


Astfel, tipul obj_adresa are drept atribute

principalele componente ale unei adrese: strada,


numar, cod postal, oras, id_tara. Metoda coninut, definit n zona de specificaii i detaliat n corpul tipului de obiecte, are rolul de a recompune adresa complet pe baza

CREATE OR REPLACE TYPE obj_adresa AS OBJECT

( 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)

RETURN SELF AS RESULT


Suprancrcarea metodelor este o form de

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):

CREATE OR REPLACE TYPE obj_adresa AS OBJECT

(..............., 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;

Modul de funcionare a celor dou metode constructor, cea implicit,

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

Tabele bazate pe tipuri de date


Odat creat specificaia obiectului, aceasta poate fi

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

Tabele bazate pe tipuri de date


Restricia de tip NOT NULL i specificarea

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

Super si sub tipuri


Una dintre caracteristicile fundamentale ale

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.

CREATE TYPE T1 AS OBJECT (...)

NOT FINAL; T2

--supertip pentru

Super si sub tipuri


Atribuirea clauzei FINAL unei metode din supertipul

de obiecte implic imposibilitatea suprancrcrii acesteia n orice subtip al celui curent:


CREATE TYPE T AS OBJECT ( ........, MEMBER PROCEDURE P1, FINAL MEMBER FUNCTION f1() ) NOT FINAL;

n exemplul urmtor tipul de obiecte obj_utilizatori

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:

CREATE OR REPLACE TYPE

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;

CREATE OR REPLACE TYPE obj_cursanti UNDER obj_utilizatori

( data_nastere DATE, MEMBER PROCEDURE adauga_cursant, MEMBER PROCEDURE sterge_cursant ) FINAL;


CREATE OR REPLACE TYPE BODY obj_cursanti AS

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;

Odat create, tipurile de obiecte pot fi utilizate i

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

Informaii despre obiecte, tipurile de obiecte,

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;

You might also like