Professional Documents
Culture Documents
pentru afaceri
STUDENT: BONCILA ANDREI Master Anul I Baze de date support Grupa 1071
Tipurile de obiecte pot fi cu uurin folosite pentru crearea tabelelor. Pentru prezentarea facilitilor obiectuale ale Oracle, studiul de caz se va focaliza pe entitatea Client i pe cele trei subentiti ale acesteia: Subscriptie, Oferta_subscriptie respectiv Adresa.
3.Exemplificri practice
Vom creea tipul ob_adresa_fact ce are drept atribute principalele componente ale unei adrese, iar metoda coninut, definit n zona de specificaii i detaliat n corpul tipului de obiecte, are rolul de a recompune adresa de facutare pe baza atributelor
CREATE OR REPLACE TYPE ob_adresa_fact AS OBJECT ( strada VARCHAR2(30), numar VARCHAR2(5), oras VARCHAR2(20), cod_postal VARCHAR2(6), MEMBER FUNCTION adresa_facturare RETURN VARCHAR2 ); CREATE OR REPLACE TYPE BODY ob_adresa_fact AS MEMBER FUNCTION adresa_facturare RETURN VARCHAR2 IS BEGIN RETURN (strada||' '|| numar||' '|| oras||' '|| cod_postal); END adresa_facturare; 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.
INSERT INTO adresa Values ( ob_adresa_fact('Tudor Vladimirescu', '26', 'Ramnicu Valcea','012531'));
Vom creea acum tipul de obiect ob_client si o functie ce va returna eligibilitatea clientului :
CREATE OR REPLACE TYPE ob_client AS OBJECT ( client_id number(9), nume VARCHAR2(30), prenume VARCHAR2(20), adresa_facturare ob_adresa_fact, data date , MEMBER function elig_client return number ) not final; CREATE OR REPLACE TYPE BODY ob_client AS member function elig_client return number is varsta number:=0; begin if trunc(months_between(sysdate,data)/12)< 18 then varsta := -1; else varsta := trunc(months_between(sysdate,data)/12);
end if; if varsta<18 then dbms_output.put_line ('Nu este eligibil'); else dbms_output.put_line('Este eligibil'); end if; return varsta; end elig_client; end;
Vom creea tipul de obiect ob_subscriptie sub tipul de obiect ob_client si o procedura de verificare a status-ului :
CREATE OR REPLACE TYPE ob_subscriptie under ob_client ( subscriptie_id number(9), no_telefon VARCHAR2(10), status varchar2(1), MEMBER procedure client_activ (status_client varchar2) ) not final; CREATE OR REPLACE TYPE BODY ob_subscriptie AS member procedure client_activ (status_client varchar2) is begin if status='A' then dbms_output.put_line('Clientul '||subscriptie_id||' '||upper(nume)||' '||upper(prenume)||' '|| no_telefon||' este activ'); else dbms_output.put_line('Clientul nu este activ'); end if; dbms_output.put_line(status_client); end client_activ; end;
END;
Ca ultima etapa vom creea un tip de obiect ob_oferta_subscriptie sub tipul ob_subscriptie:
CREATE OR REPLACE TYPE ob_oferta_subscriptie under ob_subscriptie ( cod_oferta varchar(10), nume_oferta VARCHAR2(20), data_activare date, cost number(4,2), overriding MEMBER procedure client_activ (status_client varchar2) ) not final; CREATE OR REPLACE TYPE BODY ob_oferta_subscriptie AS overriding member procedure client_activ (status_client varchar2) is begin if status='A' then dbms_output.put_line('Clientul '||subscriptie_id||' '||upper(nume)||' '||upper(prenume)||' '|| no_telefon||' este activ si are de plata'||cost); else dbms_output.put_line('Clientul nu este activ'); end if; dbms_output.put_line(status_client); end client_activ; end;
Vom initializa o instanta de tipul ob_oferta_subscriptie folosind toate atributele mostenite de la celelate 2 tipuri ob_subscriptie si ob_client:
DECLARE adresa ob_adresa_fact; status ob_oferta_subscriptie; status_client varchar2(200); BEGIN -- apelarea constructorului adresa:=ob_adresa_fact('Tudor Vladimirescu', '26', 'Ramnicu Valcea','012531'); status:= ob_oferta_subscriptie ('1781','Boncila','Andrei',adresa, to_date('07-02-1984','DD-MM-YYYY'),'1','0722953037','A','INTERNET', 'Oferte 100MB inclusi',to_date('29-02-2012','DD-MM-YYYY'),10.5);
status.client_activ(status_client);
END;