Sunteți pe pagina 1din 5

BDOO - EXEMPLU

Diagrama de clase detaliat pentru pachetul P_Angajai

Diagrama de clase detaliat pentru pachetul P_Comenzi

Implementarea bazei de date presupune implementarea claselor ntr-un


SGBDOO, stabilirea modului de asigurare a persistenei obiectelor i elaborarea
programelor pentru manipularea acestora n vederea realizrii funciunilor
sistemului n ansamblul su.
Vom prezenta n continuare modalitile de implementare n SGBD Oracle
(SGBD relaional extins cu faciliti obiectuale) a claselor detaliate anterior
utiliznd tipurile obiect, iar pentru asigurarea persistenei se vor utiliza tabelele
de obiecte.
Implementarea claselor se va realiza prin crearea de tipuri de obiecte
pentru fiecare dintre acestea.
Pentru clasa CDepartamente vom avea urmtoarea implementare:

CREATE OR REPLACE TYPE departamente_o AS OBJECT


(
id_departament NUMBER,
denumire_departament VARCHAR2(50),
id_manager NUMBER,
STATIC FUNCTION calculeaza_statistici(p_id_dep NUMBER) RETURN NUMBER
);

Crearea tabelei departamente_t pe baza definiiei clasei departamente_o:

CREATE TABLE departamente_t OF departamente_o;

Popularea tabelei se poate realiza asemntor cu modalitatea de populare


a tabelelor relaionale:

INSERT INTO departamente_t


SELECT d.id_departament, d.denumire_departament, d.id_manager
FROM departamente d ;

Crearea tipului de obiecte functii_o i a tabelei asociate se realizeaz


asemntor:

CREATE OR REPLACE TYPE functii_o AS OBJECT


(
ID_FUNCTIE
VARCHAR2(10),
DENUMIRE_FUNCTIE VARCHAR2(35),

SALARIU_MIN
NUMBER(6),
SALARIU_MAX
NUMBER(6),
STATIC FUNCTION calculeaza_statistici(p_id_func NUMBER) RETURN NUMBER
);
CREATE TABLE functii_t OF functii_o;

Clasa CAngajati are urmtoarea implementare prin crearea tipului de


obiecte Angajati_o i a tabelei obiect asociate:

CREATE OR REPLACE TYPE angajati_o AS OBJECT


(
ID_ANGAJAT
NUMBER(6),
PRENUME
VARCHAR2(20),
NUME
VARCHAR2(25),
EMAIL
VARCHAR2(25),
TELEFON
VARCHAR2(20),
DATA_ANGAJARE DATE,
ID_FUNCTIE
VARCHAR2(10),
SALARIUL
NUMBER(8,2),
COMISION
NUMBER(2,2),
ID_MANAGER
NUMBER(6),
ID_DEPARTAMENT NUMBER(4),
MEMBER FUNCTION calculeaza_bonus RETURN NUMBER,
MEMBER FUNCTION calculeaza_taxe RETURN NUMBER,
MEMBER FUNCTION calculeaza_venituri_totale RETURN NUMBER,
STATIC FUNCTION calculeaza_statistici (p_id_ang NUMBER) RETURN NUMBER
);
CREATE TABLE angajati_t OF angajati_o;

Implementarea metodelor din clase se realizeaz n corpul tipului de


obiecte (object type body) al fiecrui tip n parte.

CREATE OR REPLACE TYPE BODY departamente_o IS


STATIC FUNCTION calculeaza_statistici (p_id_dep NUMBER)
RETURN NUMBER
IS
v_nr_ang number;
BEGIN
SELECT count(*) INTO v_nr_ang
FROM angajati_t a
WHERE a.id_departament=p_id_dep;
RETURN v_nr_ang;
END;
END;
CREATE OR REPLACE TYPE BODY functii_o IS
STATIC FUNCTION calculeaza_statistici (p_id_func NUMBER)
RETURN NUMBER
IS
v_nr_ang number;
BEGIN
SELECT count(*) INTO v_nr_ang
FROM angajati_t a

WHERE a.id_functie=p_id_func;
RETURN v_nr_ang;
END;
END;

Putem interoga tabela Departamente_t pentru a afia pentru fiecare


departament denumirea i numrul de angajai, returnat de apelul funciei
calculeaza_statistici:

SELECT id_departament, denumire_departament,


departamente_o.calculeaza_statistici(id_departament)
FROM departamente_t;

Apelul funciilor din tipurile obiect se poate realiza i prin intermediul unui
bloc PL/SQL. De exemplu, se poate apela funcia calculeaz_statistici din clasa
CDepartamente pentru afiarea numrului de angajai din departamentul 50
astfel:

DECLARE
v_nr NUMBER;
BEGIN
v_nr:=departamente_o.calculeaza_statistici(50);
DBMS_OUTPUT.PUT_LINE(v_nr);
END;
/

Metodele clasei CAngajati se vor implementa n cadrul corpului tipului de


obiecte Angajati_o astfel:

CREATE OR REPLACE TYPE BODY angajati_o IS


-- functia membru calculeaza_bonus
MEMBER FUNCTION calculeaza_bonus
RETURN NUMBER
IS
BEGIN
RETURN SELF.salariul*NVL(SELF.comision,0);
END;
-- functia membru calculeaza_venituri_totale
MEMBER FUNCTION calculeaza_venituri_totale
RETURN NUMBER
IS
BEGIN
RETURN SELF.salariul*(1+NVL(SELF.comision,0));
END;
-- functia membru calculeaza_taxe
MEMBER FUNCTION calculeaza_taxe
RETURN NUMBER
IS
BEGIN

RETURN calculeaza_venituri_totale*0.16;
END;
-- functia calculeaza_statistici
STATIC FUNCTION calculeaza_statistici (p_id_ang number)
RETURN number
IS
v_nr_comenzi number;
BEGIN
SELECT COUNT(*) INTO v_nr_comenzi
FROM comenzi_t c
WHERE c.id_angajat=p_id_ang;
RETURN v_nr_comenzi;
END;
END;

Apelul funciilor membre ale tipului de obiecte Angajati_o se face utiliznd


constructorul implicit al clasei prin precizarea tuturor atributelor sale:

SELECT nume, salariul, angajati_o.calculeaza_statistici (id_angajat)


Total_comenzi,
angajati_o(ID_ANGAJAT,PRENUME, NUME, EMAIL,TELEFON,
DATA_ANGAJARE,ID_FUNCTIE, SALARIUL, COMISION, ID_MANAGER,
ID_DEPARTAMENT).calculeaza_bonus() bonus,
angajati_o(ID_ANGAJAT,PRENUME, NUME, EMAIL,TELEFON,
DATA_ANGAJARE,ID_FUNCTIE, SALARIUL, COMISION, ID_MANAGER,
ID_DEPARTAMENT).calculeaza_venituri_totale() total_venituri,
angajati_o(ID_ANGAJAT,PRENUME, NUME, EMAIL,TELEFON,
DATA_ANGAJARE,ID_FUNCTIE, SALARIUL, COMISION, ID_MANAGER,
ID_DEPARTAMENT).calculeaza_taxe() taxe
FROM angajati_t;

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