You are on page 1of 20

1 | P a g e

PROIECT BAZE DE DATE


SQL, PL/SQL



CUPRINS
1. INTRODUCERE
2. COLECTAREA I ANALIZA DATELOR. MODELUL CONCEPTUAL
3. IMPLEMENTAREA MODELULUI CONCEPTUAL
4. CREAREA TABELELOR
5. INTEROGRI
6. BIBLIOGRAFIE





GAPAR LIGIA ALEXANDRA
ANUL 3 CTI, GRUPA 3.2





2 | P a g e

1. INTRODUCERE

Acest proiect trateaz crearea unei baze de date pentru a ine evidena vnzrilor dintr-
o farmacie unde se vnd medicamente fr prescripie medical.

Farmacia are un stoc de medicamente pentru care sunt reinute urmtoarele informaii:
Un cod unic de indetificare
Denumirea medicamentului
Preul unitar al medicamentului
Numr de buci
Pentru a ine evidea unei vnzri farmacia va elibera o factura ce conine:
Un cod unic de indetificare
Data la care s-a efectuat vnzarea
Preul total achiat de client
Detalierea acestei facturi va conine urmtoarele informaii:
Un cod unic de indentificare
Numarul de buci cumprate dintr-un anumit produs
Codul medicamentului
Codul facturii










3 | P a g e

2. COLECTAREA I ANALIZA DATELOR. MODELUL CONCEPTUAL

Primul pas n realizarea unei aplicatii de baze de date este analiza datelor si realizarea
unei scheme conceptuale a acestora. In aceasta etapa sunt analizate natura si modul de
utilizare a datelor. Sunt identificate datele care vor trebui memorate si procesate, apoi se
impart aceste date in grupuri logice si se identifica relatiile care exista intre aceste grupuri.
Odata obtinute informatiile necesare realizarii modelului conceputual din intervievarea
oamenilor din cadrul farmaciei, acestea trebuie reprezentate intr-o forma convetionala, care sa
poata fi usor inteleasa de toata lumea. O astfel de reprezentare este diagrama entitati-relatii :
ERD ( Entity Relationship Diagram).
In cele ce urmeaza vom prezenta elementele ERD-ului farmaciei noastre.




apare contine





Un medicament poate sa apara pe una sau mai multe facturi, iar o factura trebuie sa
contina unul sau mai multe medicamente. Relatia dintre entitatea medicament si entitatea
factura este de tipul many-to-many.
Rezolvarea relatiei many-to-many consta in introducerea unei noi entitati, numita
entitate de intersectie, pe care o legam de entitatile originale, prin cate o relatie one-to-many.
In cazul de fata entitatea de intersectie se va numi vanzare, relatiile, care pleaca din ea, fiind
obligatorii in aceasta parte.



MEDICAMENT
#cod
*denumire
*pret
*prezentare
*buc
FACTURA
#id
*data
*pret_total
4 | P a g e
















Un medicament poate sa fie vandut cel putin o data. O vanzare trebuie sa contina un
medicament. O factura trebuie sa fie emisa pentru una sau mai multe vanzari. O vanzare
trebuie sa aiba o factura.
Urmatorul pas este adaugarea de atribute in cazul entitatii de intersectie.






a
r
e

c
o
n
t
i
n
e

VANZARE
#cid
*buc_med

MEDICAMENT
#cod
*denumire
*pret
*prezentare
*buc
FACTURA
#id
*data
*pret_total
VANZARE
5 | P a g e




ERD FINAL


este emisa
















c
o
n
t
i
n
e

a
r
e

MEDICAMENT
#cod
*denumire
*pret
*prezentare
*buc
FACTURA
#id
*data
*pret_total
VANZARE
#cid
*buc_med

6 | P a g e



3. Implementarea modelului conceptual
Transformarea modelului conceptual al ERD-ului in modelul fizic, adica in baza de date
propriu-zisa, se numeste mapare. Acest process implica transformarea fiecarui element al ERD-
ului.
Prima etapa a acestui proces consta in crearea tabelelor bazei de date astfel:
Fiecarei entitati ii va corespunde cate un table.
Fiecare atribut al unei entitati va deveni o coloana a tabelei
Fiecare coloana va memora date de acelasi tip;
Fiecare instanta a unei entitati se va transforma intr-un rand al tabelului corespunzator
Unicul identificator al entitatii devine cheia primara a tabelei
Informatiile despre o tabela a bazei de date vor fi prezentate folosind DIAGRAMA DE
TABELA.

Maparea entitatilor
Pentru entitatea MEDICAMENT vom crea tabela MEDICAMENTE astfel:










MEDICAMENT
#cod
*denumire
*pret
prezentare
*buc


7 | P a g e



MEDICAMENTE numele entitatii la plural numele tabelei
atributul coloana

instanta linia


DIAGRAMA DE TABELA:
MEDICAMENTE
Numele
coloanei
Tip de date Tip cheie Optionalitate
cod Number PK *
denumire Varchar2 - *
pret Number(7,2) - *
prezentare Varchar2 -
buc Number - *


Pentru entitatea FACTURA vom crea tabela FACTURI astfel:

FACTURI





Cod Denumire Pret Prezentare Buc
01 Algocalmin 8 comprimate 10
02 Paracetamol 5 comprimate 20
03 Bixtonim 3 picaturi 15
04 Paxeladin 12 sirop 10
Id Data Pret_total
11 13.08.2006 25
12 13.08.2006 15
13 05.02.2002 45
14 23.12.2000 150
15 06.03.2010 60
FACTURA
#id
*data
*pret_total


8 | P a g e



DIAGRAMA DE TABELA:
Numele
coloanei
Tip de date Tip cheie Optionalitate
id Number PK *
data Date - *
pret_total Number(7,2) - *



Pentru entitatea VANZARE vom crea tabela VANZARI astfel:

VANZARI




DIAGRAMA DE TABELA:
Numele
coloanei
Tip de date Tip cheie Optionalitate
cid Number PK *
cod_med Number FK *
buc_med Number - *
id_factura Number FK *

Coloanele cod_med si id_factura din tabela vanzari reprezinta relatiile cu tabela MEDICAMENTE
respectiv tabela FACTURI.

Uid Cod_med Buc_med Id_factura
100 01 1 11
101 02 2 11
102 04 2 14
103 03 2 12
VANZARE
#cid
*buc_med


9 | P a g e

4. Crearea tabelelor

a) Medicamente


Popularea tabelei Medicamente cu date:

INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`) VALUES
('bixtonim', '41', '7', '13.6', 'picaturi');
INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`) VALUES
('strepsils', '81', '5', '15.4', 'comprimate');
INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`) VALUES
('aspirina', '101', '6', '7.5', 'comprimate');
INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`) VALUES
('vitaminaC', '102', '12', '10', 'comprimate');
INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`) VALUES
('tusin', '121', '12', '12.5', 'comprimate');
10 | P a g e

INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`) VALUES
('faringosept', '123', '9', '8', 'comprimate');
INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`) VALUES
('calciu', '124', '18', '6.8', 'comprimate');
INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`) VALUES
('algocalmin', '1', '13', '8.2', 'comprimate');


b) Facturi


CREATE TABLE `pharmacy`.`Facturi` (
`ID` INT NOT NULL ,
`data` DATETIME NOT NULL ,
`pret_total` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`ID`) );
11 | P a g e

Popularea tabelei FACTURI cu date:
INSERT INTO `pharmacy`.`Facturi` (`ID`, `data`, `pret_total`) VALUES ('4', '12-05-2012', '26.4');
INSERT INTO `pharmacy`.`Facturi` (`ID`, `data`, `pret_total`) VALUES ('7', '14-12-2012', '90.6');



c) Vanzari


CREATE TABLE `pharmacy`.`Vanzari` (
`CID` INT NOT NULL ,
`cod_med` INT NOT NULL ,
`buc_med` INT NOT NULL ,
`id_factura` INT NOT NULL ,
PRIMARY KEY (`CID`) );

12 | P a g e

ALTER TABLE `pharmacy`.`vanzari`
ADD CONSTRAINT `med`
FOREIGN KEY (`cod_med` )
REFERENCES `pharmacy`.`medicamente` (`cod` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
ADD CONSTRAINT `fact`
FOREIGN KEY (`id_factura` )
REFERENCES `pharmacy`.`facturi` (`ID` )
ON DELETE NO ACTION
ON UPDATE NO ACTION
, ADD INDEX `med_idx` (`cod_med` ASC)
, ADD INDEX `fact_idx` (`id_factura` ASC) ;

Popularea tabelei VANZARI cu date:
INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('41',
'102', '1', '4');
INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('44',
'41', '1', '7');
INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('45',
'123', '2', '7');
INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('61',
'124', '1', '7');
INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('62',
'102', '2', '7');
13 | P a g e

INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('43',
'124', '2', '7');
INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('48',
'102', '1', '7');
INSERT INTO `pharmacy`.`Vanzari` (`CID`, `cod_med`, `buc_med`, `id_factura`) VALUES ('42', '1',
'2', '4');

Pentru factura cu id-ul 4 in tabela vanzari avem 2 linii deoarece au fost vandute medicamentele
cu codurile 102 si 1, din primul o bucata, iar din al doilea doua bucati. Vom modifica acum in
tabela medicamente numarul de bucati din medicamentele cumparate.
update medicamente
set buc=buc-1
where cod=102
update medicamente
set buc=buc-2
where cod=1
Pentru factura cu id-ul 7 vom proceda analog.
update medicamente
set buc=buc-2
where cod=124

update medicamente
set buc=buc-1
where cod=41
update medicamente
set buc=buc-1
where cod=81
update medicamente
set buc=buc-2
where cod=21
update medicamente
set buc=buc-1
where cod=122

14 | P a g e

update medicamente
set buc=buc-2
where cod=102

5. Interogari

SELECT * FROM pharmacy.medicamente;

Cate cutii de comprimate exista in farmacie?
SELECT sum(buc)
FROM pharmacy.medicamente;
WHERE prezentare='comprimate';
In ce data s-a efectuat vanzarea cu codul 41?
SELECT data
FROM pharmacy.facturi a, pharmacy.vanzari b
WHERE a.ID=b.id_factura and b.CID=41;
Efectuati modificarile necesare pentru o vanzare.
o Vom avea nevoie de o procedura de cautare cu 5 parametri, dintre care unul de
intrare, care reprezinta denumirea medicamentului cerut si 4 de iesire prin care
procedura va scoate codul, pretul, numarul de bucati si daca medicamentul
exista sau nu in baza de date.
create or replace procedure cautare
(x pharmacy.medicamente.denumire%type, y out pharmacy.medicamente.cod%type, z out
pharmacy.medicamente.pret%type, t out pharmacy.medicamente.buc%type, g out int) is
begin
select pret, cod, buc,1 into z,y,t,g
from pharmacy.medicamente
where upper(denumire)=upper(x);
15 | P a g e

exception
when no_data_found
then z:=0; y:=0; t:=0; g:=0;
end;

o Blocul anonim in care se efectueaza modificarile necesare in tabele:

Declare
x varchar2(20);
y pharmacy.medicamente.cod%type;
z pharmacy.medicamente.pret%type;
t pharmacy.medicamente.buc%type;
g number;
c number;
xx number;
yy number;
stotal decimal(8,2);
begin

stoal:=0;
select "FACTURI_SEQ".nextval into xx from dual;
insert into pharmacy.facturi values (xx,sysdate,0);
x:= :dati_med;
cautare(x,y,z,t,g);
16 | P a g e

if(g=0) then
dbms_output.put_line('Nu avem '||x);
else
dbms_output.put_line('Avem '||t||'bucati din medicamentul '||x||' la pretul '||z||'
lei');
c:= :dati_cantitatea;
if c>t then
dbms_output.put_line('Nu avem cantitatea ceruta');
else
update medicamente
set buc=buc-c
where cod=y;
select "VANZARI_SEQ".nextval into yy from dual;
insert into pharmacy.vanzari values (yy,y,c,xx);
stotal:=stotal+c*z;
end if;
end if;
if(g=1) then
update pharmacy.facturi set pret_total=stotal where id=xx;
else
delete from facturi where id=xx;
end if;
end;

17 | P a g e

Farmacia primeste ca marfa: 2 bixtonim picaturi, 2 tusin comprimate, 5 mucosin sirop la
pret 20.3 lei.
update pharmacy.medicamente
set buc=buc+2
where cod=41;

update pharmacy.medicamente
set buc=buc+10
where cod=121;

INSERT INTO `pharmacy`.`medicamente` (`denumire`, `cod`, `buc`, `pret`, `prezentare`)
VALUES ('mucosin', '68', '20.3', '5', 'sirop');

Afisati in ordine alfabetica medicamentele sub forma de comprimate
select * from pharmacy.medicamente
where prezentare='comprimate'
order by denumire;
o Procedura ce ordoneaza alfabetic medicamentele si are un parametru de intrare
create or replace procedure
alfa(x pharmacy.medicamente.prezentare%type) is
cursor c is
select denumire,prezentare
from medicamente
where prezentare=x
18 | P a g e

order by 1;
begin
for v in c loop
dbms_ouput.put_line(initcap(v.denumire)||' '||v.prezentare);
end loop;
end;
o Blocul anonim in care apelam procedura
begin
alfa(comprimate);
end;
Cate facturi s-au efectuat intre anumiti ani?
o Vom folosi o functie care numara facturile si are drept parametrii de intrare
doua numere:
create or replace function catef
(a number, b number) return number is
cate number;
begin
select count(*) into cate
from facturi
where to_number(to_char(data,'yyyy')) between a and b;
return cate;
end;
o Blocul anonim:
declare
a number;
b number;
begin
a:= :dati_an1;
b:= :dati_an2;
dbms_output.put_line('S-au eliberat '||catef(a,b)||' facturi in perioada '||a||'-
'||b);end;

19 | P a g e

Care este cea mai mare incasare?
select max(pret_total), count(id_factura)
from pharmacy.vanzari a, pharmacy.facturi b
where a.id_factura=b.id ;

Care este pretul mediu al vanzarilor?
select avg(pret_total)
from pharmacy.facturi ;
Scumpiti cu 10% medicamentele sub forma de picaturi.
update pharmacy.medicamente
set pret=1.1*pret
where prezentare='picaturi';
select * from pharmacy.medicamente
where prezentare='picaturi';










20 | P a g e


6. Bibliografie
Manual de informatica autor Carmen Popescu, editura L&S 2007
https://academy.oracle.com

You might also like