Sunteți pe pagina 1din 13

-CRAIOVA 2013Am realizat o aplicatie pentru gestionarea clientilor unei companii care realizeaza asigurari si credit ipotecar.

Se tine evidenta clientilor cu toate datele referitoare la clienti (Nr_client, Adresa_client, Nume_client, Oras, Judet) si informatiile despre asigurarea (Numar_cont, Tip_asigurare, Cod_companie, Filiala, Rata_an, Suma_asigurata, durata) clientului sau creditului ipotecar (Numar_cont, Filiala, Suma_imprumutata, Suma_de_restituit, Tip_cont, Tip_ipoteca, Rata_dobanzii, Unitatea_masura) dupa caz. De asemenea putem afla detalii despre compania de asigurari si despre filiala la care a fost incheiata asigurarea sau creditul. Baza de date contine urmatoarele tabele: Asigurari, Client, Detalii_asigurare, Filiala, Ipoteca, Moneda, Plati_credit_ipotecar. Tabelul Asigurari contine urmatoarele campuri: Numar_cont, Tip_asigurare, Cod_companie_asigurare, Filiala, Suma_asigurata, Rata_an, Durata. Tabelul Client contine urmatoarele campuri: Nr_client, Adresa_client, Nume_client, Oras, Judet. Tabelul Detalii_asigurare contine urmatoarele campuri: Cod_companie_asigurare, detalii_companie_asigurare. Tabelul Filiala contine urmatoarele campuri: Filiala, Nume_filiala. Tabelul Ipoteca contine urmatoarele campuri: Numar_cont, Filiala, Suma_imprumutata, Suma_de_restituit, Tip_ipoteca, Tip_ipoteza, Rata_dobanzii, Nr_client, Unitate_masura. Tabelul Moneda contine urmatoarele campuri: Unitate_masura, Rata_dobanzii. Tabelul Plati_credit_ipotecar contine urmatoarele campuri: Nr_client, Data_limita, Plata, Penalizare_zi. Cerintele proiectului sunt urmatoarele: Proiectul contine 4 tipuri de proceduri (cu parametru de intrare, cu parametru de iesire, cu parametru de intrare/iesire, fara parametru), 4 functii, un declansator, cursoare (explicit si implicit).

Pentru executarea proiectului Credit ipotecar si asigurari am folosit sistemul de gestionare a bazelor de date ORACLE 10G. 1

Tabelul Client stocheza informatii legate de clienti. Tabelul Asigurari contine toate datele necesare despre asigurarile clientilor, iar tabelul Ipoteca contine toate datele despre creditele clientilor. Tabelul Moneda ne ofera informatii despre rata dobanzii in functie de moneda in care sunt facute creditele sau asigurarile. Din tabelul Plati_credit_ipotecar putem afla informatii despre data limita de plata a ratei, penalizarea pe zi care se aplica la intarzierea plati si, de asemenea, putem afla daca plata a fost facuta sau nu pana la data curenta. Tabelul Client contine urmatoarele date: Nr_client 1 2 3 4 5 6 7 8 9 10 11 Adresa_client str Libertatii nr 31 bd G-ral Magheru nr 25 str Imparatul Traian str I A Cuza nr 41 str Unirii nr 13 str Caracal nr 199 str I E Florescu nr 14 str Craiovei nr 111 str Carol I nr 231 str Vasile Parvan nr 2 Carol I nr 15 Nume_client Popa Silvia Georgeta Popescu Stefania Ionescu Traian Georgescu Ion Ursu Mihaela Popescu Octavian Dragut Cristian Iliescu Mariana Albu Valeriu Dinu Sorin Vasilescu Emilian Oras Craiova Craiova Craiova Craiova Craiova Craiova Craiova Slatina Slatina Filiasi Filiasi Judet Dolj Dolj Dolj Dolj Dolj Dolj Dolj Dolj Dolj Dolj Dolj

Tabelul Asigurari contine urmatoarele date: Numar_cont 1042 7691 3508 6153 1403 5923 1657 3952 4247 3220 0608 4621 4282 8203 2767 6476 5368 4302 1427 5137 6763 7300 0480 8479 Tip_asigurare Cod_companie_asigurare Nr_client Filiala Suma_asigurata Rata_an Durata pensie privata 444 RCA de viata 555 333 8 11 1 2 4 3 435 123 394 394 394 394 154000 32000 100000 70000 200000 50000 0.04 0.05 0.05 0.05 0.05 0.04 120 240 360 240 360 240

pensie privata 111 CASCO pt locuinta 666 222

Tabelul Ipoteca are urmatoarele date: Numar cont 2109 3287 5460 1357 3192 6108 4000 3157 Suma Suma de imprumutata restituit 55000 150000 0 0 Tip cont lunar lunar 2 Tip ipoteca Rata dobanzii Nr client 10 6 Unitate masura USD USD

Filiala 123 394

Durata 84 72

restituire 0.04 restituire 0.04

3491 5076 2810 7234 5650 1924 0371 7569 9182 3475 6041 5972

435 394 394

45000 90000 100000

0 0 0

lunar lunar lunar

restituire 0.05 restituire 0.05 restituire 0.15

9 5 7

EURO EURO RON

60 120 48

Suma_de_restituit va fi completata in tabele in urma executarii unei instructiuni SQL la cererea utilizatorului. Tabelul Filiala va contine urmatoarele date: Filiala 123 394 435 613 721 Nume_filiala EPM Filiasi EPM Craiova EPM Slatina EPM Valcea EPM Pitesti Tabelul Detalii_asigurare va contine urmatoarele date: Cod_companie_asigurare 111 222 333 444 555 666 Detalii_companie_asigurare Grawe Romania Allianz Tiriac ING Generali Asirom Asirag

Tabelul Moneda va contine urmatoarele date: Unitate_masura EURO RON USD Rata_dobanzii 0.05 0.13 0.04

Tabelul Plati_credit_ipotecar va contine urmatoarele date: Nr_client 5 6 7 9 10 Data_limita 10/11/2006 12:00:00 AM 3/3/2006 12:00:00 AM 4/27/2006 12:00:00 AM 11/12/2006 12:00:00 AM 11/11/2006 12:00:00 AM Plata nu nu nu da da Penalizare_zi 1 0.5 0.1 2 0.7

Crearea tabelelor si introducerea de date in acestea Pentru rezolvarea acestei probleme am folosit 7 tabele: Asigurari, Client, Detalii_asigurare, Filiala, Ipoteca, Moneda, Plati_credit_ipotecar. 1. Pentru crearea tabelului Asigurari: CREATE TABLE Asigurari ( Numar_cont VARCHAr(30) PRIMARY KEY, Tip_asigurare VARCHAR(20), 4

Cod_companie_asigurare VARCHAR(20) ); ALTER TABLE Asigurari ADD Nr_client real; ALTER TABLE Asigurari ADD Filiala real; ALTER TABLE Asigurari ADD Suma_asigurata real; ALTER TABLE Asigurari ADD rata_an real; ALTER TABLE Asigurari ADD durata int; Pentru inserarea datelor in tabelul Asigurari s-au folosit urmatoarele comenzi: INSERT INTO Asigurari VALUES('4247 3220 0608 4621','de viata','333','1','394','100000','0.05','360'); INSERT INTO Asigurari VALUES('4282 8203 2767 6476','pensie privata','111','2','394','70000','0.05','240'); INSERT INTO Asigurari VALUES('6763 7300 0480 8479','pt locuinta','222','3','394','50000','0.04','240'); INSERT INTO Asigurari VALUES('5368 4302 1427 5137','CASCO','666','4','394','200000','0.05','360'); INSERT INTO Asigurari VALUES('1403 5923 1657 3952','RCA','555','11','123','32000','0.05','240'); INSERT INTO Asigurari VALUES('1042 7691 3508 6153','pensie privata','444','8','435','154000','0.04','120'); 2. Pentru crearea tabelului Client: CREATE TABLE Client ( Nr_client REAL NOT NULL PRIMARY KEY, Adresa_client VARCHAR(50) NOT NULL, Nume_client VARCHAR(30) NOT NULL); ALTER TABLE Client ADD Oras varchar(20) not null; ALTER TABLE Client ADD Judet varchar(20) not null; Pentru inserarea datelor in tabelul Client s-au folosit urmatoarele comenzi: INSERT INTO Client VALUES('1','str Libertatii nr 31','Popa Silvia Georgeta','Craiova','Dolj'); INSERT INTO Client VALUES('2','bd G-ral Magheru nr 25','Popescu Stefania','Craiova','Dolj'); INSERT INTO Client VALUES('3','str Imparatul Traian','Ionescu Traian','Craiova','Dolj'); INSERT INTO Client VALUES('4','str I A Cuza nr 41','Georgescu Ion','Craiova','Dolj'); INSERT INTO Client VALUES('5','str Unirii nr 13','Ursu Mihaela','Craiova','Dolj'); insert into Client values('6','str Caracal nr 199','Popescu Octavian','Craiova','Dolj'); insert into Client values('7','str I E Florescu nr 14','Dragut Cristian','Craiova','Dolj'); insert into Client values('8','str Craiovei nr 111','Iliescu Mariana','Slatina','Dolj'); insert into Client values('9','str Carol I nr 231','Albu Valeriu','Slatina','Dolj'); insert into Client values('10','str Vasile Parvan nr 2','Dinu Sorin','Filiasi','Dolj'); insert into Client values('11','Carol I nr 15','Vasilescu Emilian','Filiasi','Dolj'); 3. Pentru crearea tabelului Detalii_asigurare: create table Detalii_asigurare( 5

Cod_companie_asigurare varchar(20) not null primary key, Detalii_companie_asigurare varchar(30) not null); Pentru inserarea datelor in tabelul Detalii_asigurare s-au folosit urmatoarele comenzi: insert into Detalii_asigurare values('111','Grawe Romania'); insert into Detalii_asigurare values('222','Allianz Tiriac'); insert into Detalii_asigurare values('333','ING'); insert into Detalii_asigurare values('444','Generali'); insert into Detalii_asigurare values('555','Asirom'); insert into Detalii_asigurare values('666','Asirag'); 4. Pentru crearea tabelului Filiala: create table Filiala ( Filiala real not null primary key, Nume_filiala varchar(20) not null); Pentru inserarea datelor in tabelul Filiala s-au folosit urmatoarele comenzi: insert into Filiala values('123','EPM Filiasi'); insert into Filiala values('435','EPM Slatina'); insert into Filiala values('394','EPM Craiova'); insert into Filiala values('613','EPM Valcea'); insert into Filiala values('721','EPM Pitesti'); 5. Pentru crearea tabelului Ipoteca: create table Ipoteca ( Numar_cont varchar(20) not null primary key, Filiala real not null, Suma_imprumutata real not null, Suma_de_restituit real not null, Tip_cont varchar(10) not null, Tip_ipoteca varchar(20) not null, Rata_dobanzii real not null, Nr_client real not null ); alter table Ipoteca add Unitate_masura varchar(4) not null; alter table Ipoteca add durata int not null; Pentru inserarea datelor in tabelul Ipoteca s-au folosit urmatoarele comenzi: insert into Ipoteca values('5650 1924 0371 7569','394','90000','0','lunar','restituire','0.05','5','EURO','120'); insert into Ipoteca values('3192 6108 4000 3157','394','150000','0','lunar','restituire','0.04','6','USD','72'); insert into Ipoteca values('9182 3475 6041 5972','394','100000','0','lunar','restituire','0.15','7','RON','48'); 6

insert into Ipoteca values('3491 5076 2810 7234','435','45000','0','lunar','restituire','0.05','9','EURO','60'); insert into Ipoteca values('2109 3287 5460 1357','123','55000','0','lunar','restituire','0.04','10','USD','84'); 6. Pentru crearea tabelului Moneda: create table Moneda( Unitate_masura varchar(4) not null primary key, Rata_dobanzii real not null); Pentru inserarea datelor in tabelul Moneda s-au folosit urmatoarele comenzi: insert into Moneda values('RON','0.13'); insert into Moneda values('EURO','0.05'); insert into Moneda values('USD','0.04'); 7. Pentru crearea tabelului Plati_credit_ipotecar: create table Plati_credit_ipotecar ( Nr_client real not null primary key, Data_limita date, Plata varchar(2), Penalizare_zi real not null); Pentru inserarea datelor in tabelul Plati_credit_ipotecar s-au folosit urmatoarele comenzi: insert into Plati_credit_ipotecar values('5',date'2006-01-02','nu','1'); insert into Plati_credit_ipotecar values('6',date'2007-11-11','nu','0.5'); insert into Plati_credit_ipotecar values('7',date'2007-05-05','nu','0.1'); insert into Plati_credit_ipotecar values('9',date'2007-06-06','da','2'); insert into Plati_credit_ipotecar values('10',date'2007-03-03','da','0.7');

Executarea cerintelor 1. anumit client: %TYPE 7 Functii: Am realizat o functie care ofera informatii despre localitatea din care este un

create or replace function oras(v_nume Client.Oras%TYPE) return Client.Oras

AS v_oras Client.Oras%TYPE; BEGIN BEGIN SELECT Oras INTO v_oras FROM Client WHERE v_nume=Nume_client; EXCEPTION WHEN NO_DATA_FOUND THEN v_oras:='Clientul nu exista'; END; RETURN v_oras; end; DECLARE a varchar(20); begin a:=oras('Popa Silvia Georgeta'); DBMS_OUTPUT.PUT_LINE(a); end; DECLARE a varchar(20); begin a:=oras('Maria'); DBMS_OUTPUT.PUT_LINE(a); end; Am realizat o functie care calculeaza suma creditelor dintr-o filiala: create or replace function suma_credit(fil Ipoteca.Filiala%TYPE) RETURN REAL AS Suma_creditelor Ipoteca.Suma_imprumutata%TYPE; BEGIN SELECT SUM(Suma_imprumutata) INTO Suma_creditelor FROM Ipoteca WHERE fil=Filiala; RETURN Suma_creditelor; END; DECLARE A REAL; BEGIN A:=suma_credit(394); DBMS_OUTPUT.PUT_LINE(A); END; Am realizat o functie care returneaza numarul clientilor care au restante de plata sau numarul clientilor bun platnici: create or replace function restant(p IN varchar2) RETURN NUMBER 8

AS Numar NUMBER; BEGIN BEGIN SELECT count(*) INTO Numar FROM Plati_credit_ipotecar WHERE Plata=p; EXCEPTION WHEN NO_DATA_FOUND THEN Numar := 0 ; END; RETURN Numar; END; declare a number:=0; b number:=0; begin a:=restant('nu'); DBMS_OUTPUT.PUT_LINE('Clienti restantieri '||a); b:=restant('da'); DBMS_OUTPUT.PUT_LINE('Clienti restantieri '||b); end; 2. Proceduri

Un alt mod in care putem realiza crearea tabelelor este prin utilizarea unei proceduri: create or replace procedure creare_tabele AS v_sql_stmt VARCHAR2(2000); BEGIN v_sql_stmt:='CREATE table Ipoteca (Numar_cont varchar(20) PRIMARY KEY NOT NULL, Filiala varchar(20) NOT NULL, Suma_imprumutata REAL NOT NULL, Suma_de_restituit REAL NOT NULL, Tip_cont varchar(10) NOT NULL, Tip_ipoteca varchar(20) NOT NULL, Rata_dobanzii REAL NOT NULL, Unitate_masura varchar(4) NOT NULL, durata integer not null )'; execute immediate v_sql_stmt; v_sql_stmt:='CREATE table Asigurari (Numar_cont varchar(20) PRIMARY KEY NOT NULL, Tip_asigurare varchar(20) NOT NULL, Cod_companie_asigurare varchar(20) NOT NULL, Nr_client REAL NOT NULL, Filiala REAL NOT NULL, 9

Suma_asigurata REAL NOT NULL, rata_an REAL NOT NULL, durata INTEGER NOT NULL,)'; execute immediate v_sql_stmt; v_sql_stmt:='CREATE table Detalii_asigurare (Cod_companie_asigurare varchar(20) PRIMARY KEY NOT NULL, Detalii_companie_asigurare varchar(30) NOT NULL)'; execute immediate v_sql_stmt; v_sql_stmt:='CREATE table Client (Nr_client REAL PRIMARY KEY NOT NULL, Adresa_client varchar(50) NOT NULL, Nume_client varchar(30) NOT NULL, Oras varchar(20) NOT NULL, Judet varchar(20) NOT NULL)'; execute immediate v_sql_stmt; v_sql_stmt:='CREATE table Filiala (Filiala real PRIMARY KEY NOT NULL, Nume_filiala varchar(20) NOT NULL)'; execute immediate v_sql_stmt; v_sql_stmt:='CREATE table Moneda (Unitate_masura varchar(4) NOT NULL PRIMARY KEY, Rata_dobanzii REAL NOT NULL)'; execute immediate v_sql_stmt; v_sql_stmt:='CREATE table Plati_credit_ipotecar (Nr_client real not null primary key, Data_limita date, Plata varchar(2), Penalizare_zi real not null)'; execute immediate v_sql_stmt; END; begin creare_tabele; end; Am realizat o procedura fara parametrii se face un update in tabelul Ipoteca cu suma pe care clientii o au de restituit pe parcursul duratei imprumutului: create or replace procedure restituire as begin update Ipoteca set Suma_de_restituit=Suma_imprumutata+ (Suma_imprumutata*Rata_dobanzii)*(Durata/12); end; 10

Am realizat o procedura cu un parametru de intrare si unul de iesire care calculeaza dobanda pe care clientul trebuie sa o plateasca conform creditului solicitat: CREATE OR REPLACE PROCEDURE dobanda_client(client IN Ipoteca.Nr_Client %TYPE,dob OUT REAL) AS suma Ipoteca.Suma_imprumutata%TYPE; rata Ipoteca.Rata_dobanzii%TYPE; BEGIN SELECT Suma_imprumutata, Rata_dobanzii INTO suma,rata FROM Ipoteca WHERE client=Nr_client; dob:=(suma*rata); END; DECLARE dob real :=0; begin dobanda_client(5,dob); DBMS_OUTPUT.PUT_LINE(dob); end; Am realizat o procedura cu un parametru de intrare si unul de intrare/iesire care calculeaza suma pe care clientul ar avea-o de restituit in cazul aprobarii creditului la sfarsitul acestuia. Acest lucru este informativ si ajuta clientul in luarea unei decizii asupra aceptarii sau nu a creditului: CREATE OR REPLACE procedure informatie(client IN Ipoteca.Nr_client %TYPE,suma IN OUT Ipoteca.Suma_imprumutata%TYPE) AS dobanda Ipoteca.Rata_dobanzii%TYPE; durata_ani REAL; v_durata Ipoteca.durata%TYPE; s REAL; BEGIN BEGIN SELECT Rata_dobanzii, durata INTO dobanda,v_durata FROM Ipoteca WHERE client=Nr_client; EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Clientul nu este in baza de date'); END; durata_ani:=v_durata/12; s:=suma; suma:=s+(s*dobanda)*durata_ani; END; declare 11

suma real:=60000; begin informatie(10,suma); DBMS_OUTPUT.PUT_LINE('Suma de restituit ar fi: '||suma); end; 3. Cursoare

Am realizat un cursor explicit care realizeaza uniformizarea dobanzii la toate cretitele in functie de o dobanda maxima: DECLARE CURSOR bonificatie IS select b.* from Client a, Ipoteca b where a.Nr_client=b.Nr_client; r Ipoteca%ROWTYPE; dobanda REAL; BEGIN OPEN bonificatie; FETCH bonificatie into r; WHILE bonificatie%FOUND LOOP IF r.Rata_dobanzii>0.04 THEN dobanda:=r.Rata_dobanzii; update Ipoteca set Rata_dobanzii=dobanda+0.001; END IF; FETCH bonificatie into r; END LOOP; CLOSE bonificatie ; END; select * from Ipoteca Am realizat un cursor implicit care mareste durata perioadei de asigurare pentru asigurarile a caror durata este mai mica de 240 de luni: DECLARE v_durata Asigurari.Durata%TYPE; numar INTEGER; BEGIN v_durata:=240; update Asigurari set Durata=Durata+60 where Durata<=v_durata; IF SQL%FOUND THEN DBMS_OUTPUT.PUT_LINE('exista asigurari pe o perioada mai scurta de '|| v_durata); numar:=SQL%ROWCOUNT; DBMS_OUTPUT.PUT_LINE('Sunt '||numar); ELSE DBMS_OUTPUT.PUT_LINE('Nu exista pe o perioada mai scurta de 240 luni'); END IF; END; 12

select * from Asigurari; 4. Declansator

Am realizat un declansator care la inserarea unui nou client in tabelul Ipoteca calculeaza rata de dobanda pentru acesta in functie de o dobanda maxima: create or replace TRIGGER crestere_dobanda BEFORE insert on Ipoteca REFERENCING OLD as OLD new as new for each row begin select NVL(MAX(Rata_dobanzii),0.04)+0.1 into :new.Rata_dobanzii from Ipoteca; end; insert into Ipoteca values('3191 6108 4000 3156','394','150000','0','lunar','restituire','0.04','14','USD','71'); select * from Ipoteca;

13