Sunteți pe pagina 1din 32

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.

Instana unui tip de obiecte reprezint realizarea acestuia, dat

de valorile atributelor aferente.

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 instaniat

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 de param.
furnizai

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 de baz.

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 cadrul sectiunii de definire a specificatiilor NU pot fi
definite constante, exceptii, cursori.

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 iniializat i nu

poate primi restricia NOT NULL.

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. (tip varchar2,char)
Metoda coninut, definit n zona de specificaii i detaliat n
corpul tipului de obiecte, are rolul de a recompune adresa
complet pe baza atributelor: (function adresa_completa)

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
Exercitiu: realizai un bloc Pl/Sql in care sa definii o
variabil de tipul obj_adres i sa o iniializai folosind
metoda constructor.

Exerciiu
SET SERVEROUTPUT ON
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.

Parametrul SELF
Metodele de tip MEMBER accepta un parametru implicit

numit SELF, care este o instanta a tipului de obiect.


Indiferent daca este declarat implicit sau explicit, acesta este
intotdeauna primul parametru transmis unei metode de tip
MEMBER.
Metodele de tip STATIC nu pot accepta sau referi parametrul
SELF

Exercitiu
Completati specificatia si corpul tipului de obiecte

obj_adresa astfel nct metoda constructor s fie


suprancrcat
pentru simplificarea exemplificrii se considera 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;

Exercitiu
Exemplificati modul de utilizare al celor doua metode

constructor, intr-un bloc PL/SQL.


Execuia blocului anterior sa duca la afiarea urmtoarelor
dou instanieri ale tipului de obiecte creat
Str.Lunga 10 012531 Brasov RO
Bd.Unirii 105 012531 Bucuresti RO

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;

S-ar putea să vă placă și