Sunteți pe pagina 1din 15

ACADEMIA DE STUDII ECONOMICE

Proiect SGBD
Gestiune S.C. ABC Birotica S.R.L.

Anca Roxana Matei


Structura Proiect
Structura Proiect...............................................................................................................................2
Descrierea problemei.......................................................................................................................3 Pag | 2
Prezentarea schemei conceptuale a tabelelor...............................................................................4
Interacţiunea cu serverul Oracle prin intermediul comenzilor SQL................................................5
LDD.............................................................................................................................................5
CREATE .................................................................................................................................5
ALTER.....................................................................................................................................9
LMD.............................................................................................................................................9
Structuri..........................................................................................................................................10
Alternativa .................................................................................................................................10
Repetitiva...................................................................................................................................10
Tratarea excepţiilor........................................................................................................................11
Implicite.....................................................................................................................................11
Explicite.....................................................................................................................................12
Gestionarea cursorilor....................................................................................................................12
Impliciți......................................................................................................................................12
Expliciți......................................................................................................................................13
Funcţii, proceduri, includerea acestora în pachete.........................................................................13
Funcții .......................................................................................................................................13
Proceduri....................................................................................................................................13
Pachete.......................................................................................................................................14
Declanşatori...................................................................................................................................15
Pag | 3

Descrierea problemei
S.C. ABC Birotica S.R.L., o firmă fictivă distibuitoare de produse de birotică necesită
construirea unei baze de date pentru o mai bună gestiune a produselor achizitionate,
comercializate sau aflate încă pe stoc.
Pentru realizarea acesteia se construiește următorul plan:
Denumire Tabelă Explicații Câmpuri Tabelă
FURNIZORI Informații furnizori Cod furnizor (ID)
Denumire furnizor
CIF
Adresă furnizor
Cont bancar furnizor
INTRĂRI Informații generale facturi Număr factură
marfă achiziționată (facturi de Data emiterii
la furnizori) Data scadentă
Starea mărfii (livrat, nelivrat,
livrat parțial)
Situația plății (achitat, neachitat,
achitat parțial)
RÂND CONANDĂ IN Detalierea facturilor de la Cod bare
furnizori Preț
Cantitate
RÂND COMANDĂ OUT Detalierea facturilor emise de Cod bare
S.C. ABC Birotica S.R.L. Preț
Cantitate
IEȘIRI Informații generale facturi Număr factură
emise de S.C. ABC Birotica Data emiterii
S.R.L. Data scadentă
Starea mărfii (livrat, nelivrat,
livrat parțial)
Situația plății (achitat, neachitat,
achitat parțial)
CLIENȚI Informații clienti Cod client (ID)
Nume client
Natura juridică
CIF/CNP
Adresă client
Cont bancar client
PRODUSE Produse în stoc Denumire produs
Unitatea de măsură
Stoc
Prezentarea schemei conceptuale a tabelelor
FURNIZORI
ID_FUR DENUMIRE_FUR CIF ADRESA_FUR CONT_FUR

INTRĂRI Pag | 4
NR_FACT_IN DATA_EMITERE_IN DATA_SCADENTA_IN ID_FUR STARE_MARFA_IN STARE_PLATA_IN

RAND_COMANDA_IN
COD_BARE NR_FACT_IN PRET_IN CANTITATE_IN

PRODUSE (+)
COD_BARE DENUMIRE UM STOC

RAND_COMANDA_OUT (-)
COD_BARE NR_FACT_OUT PRET_OUT CANTITATE_OUT

IEȘIRI
NR_FACT_OUT DATA_EMITERE_OUT DATA_SCADENTA_OUT ID_CLI STARE_MARFA_OUT STARE_PLATA_OUT

CLIENTI
ID_CLI NUME_CLIENT TIP_CLIENT CIF_CNP ADRESA_CLIENT CONT_CLIENT
Interacţiunea cu serverul Oracle prin intermediul
comenzilor SQL
LDD
CREATE Pag | 5
-- Create table
create table FURNIZORI
(
id_fur NUMBER(5) not null,
denumire_fur VARCHAR2(20) not null,
cif VARCHAR2(9),
adresa_fur VARCHAR2(50),
cont_fur VARCHAR2(24)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
-- Create/Recreate primary, unique and foreign key constraints
alter table FURNIZORI
add constraint PKEY_FURNIZOR primary key (ID_FUR)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255;
alter table FURNIZORI
add unique (CIF)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255;

-- Create table
create table INTRARI
(
nr_fact_in NUMBER(10) not null,
data_emitere_in DATE not null,
data_scadenta_in DATE not null,
id_fur NUMBER(5) not null,
stare_marfa_in VARCHAR2(15),
stare_plata_in VARCHAR2(15)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
-- Create/Recreate primary, unique and foreign key constraints
alter table INTRARI
add constraint PKEY_FACT_IN primary key (NR_FACT_IN)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255;
alter table INTRARI
add constraint FK_ID_FUR foreign key (ID_FUR)
references FURNIZORI (ID_FUR);
-- Create/Recreate check constraints Pag | 6
alter table INTRARI
add constraint CK_STARE_MARFA_IN
check (stare_marfa_in IN('livrat',
'livrat partial','nelivrat'));
alter table INTRARI
add constraint CK_STARE_PLATA_IN
check (stare_plata_in IN('achitat',
'achitat partial','neachitat'));

-- Create table
create table RAND_COMANDA_IN
(
cod_bare VARCHAR2(10),
nr_fact_in NUMBER(10),
pret_in NUMBER(7,2),
cantitate_in NUMBER(5)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
-- Create/Recreate primary, unique and foreign key constraints
alter table RAND_COMANDA_IN
add constraint FK_COD_BARE foreign key (COD_BARE)
references PRODUSE (COD_BARE);
alter table RAND_COMANDA_IN
add constraint FK_NR_FACT_IN1 foreign key (NR_FACT_IN)
references INTRARI (NR_FACT_IN);
-- Create/Recreate check constraints
alter table RAND_COMANDA_IN
add constraint CK_PRET_IN
check (pret_in > 0);

-- Create table
create table CLIENTI
(
id_cli NUMBER(5) not null,
nume_client VARCHAR2(20) not null,
tip_client VARCHAR2(10),
cif_cnp VARCHAR2(9),
adresa_client VARCHAR2(50),
cont_client VARCHAR2(24)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
-- Create/Recreate primary, unique and foreign key constraints
alter table CLIENTI
add constraint PKEY_CLIENT primary key (ID_CLI)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255; Pag | 7
alter table CLIENTI
add unique (CIF_CNP)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255;
-- Create/Recreate check constraints
alter table CLIENTI
add constraint CK_TIP_CLIENT
check (tip_client IN (
'p_juridica', 'p_fizica'));

-- Create table
create table IESIRE
(
nr_fact_out NUMBER(10) not null,
data_emitere_out DATE not null,
data_scadenta_out DATE not null,
id_cli NUMBER(5) not null,
stare_marfa_out VARCHAR2(15),
stare_plata_out VARCHAR2(15)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
-- Create/Recreate primary, unique and foreign key constraints
alter table IESIRE
add constraint PKEY_FACT_OUT primary key (NR_FACT_OUT)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255;
alter table IESIRE
add constraint FK_ID_CLIENT foreign key (ID_CLI)
references CLIENTI (ID_CLI);
-- Create/Recreate check constraints
alter table IESIRE
add constraint CK_STARE_MARFA_OUT
check (stare_marfa_out IN('livrat',
'livrat partial','nelivrat'));
alter table IESIRE
add constraint CK_STARE_PLATA_OUT
check (stare_plata_out IN('achitat',
'achitat partial','neachitat'));
-- Create table
create table RAND_COMANDA_OUT
(
cod_bare VARCHAR2(10),
nr_fact_out NUMBER(10),
pret_out NUMBER(7,2),
cantitate_out NUMBER(5) Pag | 8
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
-- Create/Recreate primary, unique and foreign key constraints
alter table RAND_COMANDA_OUT
add constraint FK_COD_BARE1 foreign key (COD_BARE)
references PRODUSE (COD_BARE);
alter table RAND_COMANDA_OUT
add constraint FK_NR_FACT_OUT foreign key (NR_FACT_OUT)
references IESIRE (NR_FACT_OUT);
-- Create/Recreate check constraints
alter table RAND_COMANDA_OUT
add constraint CK_PRET_OUT
check (pret_out > 0);

-- Create table
create table PRODUSE
(
cod_bare VARCHAR2(10) not null,
denumire_produs VARCHAR2(20) not null,
pret NUMBER(7,2),
um VARCHAR2(10),
stoc NUMBER(7)
)
tablespace USERS
pctfree 10
initrans 1
maxtrans 255;
-- Create/Recreate primary, unique and foreign key constraints
alter table PRODUSE
add constraint PKEY_COD_BARE primary key (COD_BARE)
using index
tablespace USERS
pctfree 10
initrans 2
maxtrans 255;
-- Create/Recreate check constraints
alter table PRODUSE
add constraint CK_PRET
check (pret > 0);
alter table PRODUSE
add constraint CK_UM
check (um IN ('bucata',
'pachet'));
ALTER
-- Ștergerea coloanei PRET din tabela PRODUSE
SQL> ALTER TABLE produse DROP COLUMN pret;

Table altered
Pag | 9
-- Ștergerea constrângerii FK_NR_FACT_OUT din tabela RAND_COMANDA_OUT
SQL> alter table rand_comanda_out drop constraint fk_nr_fact_out;

Table altered

-- Redenumirea tabelei IESIRE în IESIRI


SQL> alter table IESIRE
2 rename to iesiri;

Table altered

--Adaugarea FK_NR_FACT_OUT în tabela RAND_COMANDA_OUT după efectuarea


modificării tabelei IESIRE/IESIRI
SQL> alter table rand_comanda_out
2 add constraint fk1_NR_FACT_OUT
3 FOREIGN KEY (nr_fact_out)
4 REFERENCES Clienti(nr_fact_out)

Table altered

-- Redenumire coloana DENUMIRE_PRODUS din tabela PRODUSE


SQL> alter table produse
2 rename column denumire_produs to denumire;

Table altered

--Modificare coloana DENUMIRE din tabela PRODUSE


SQL> alter table produse
2 modify (denumire varchar2 (100) unique);

Table altered

LMD
-- Sa se selecteze furnizorul cu id-ul 113
SET SERVEROUTPUT ON
DECLARE
v_denumire_fur furnizori.denumire_fur%type;
BEGIN
select denumire_fur
into v_denumire_fur
from furnizori
where id_fur='113';
dbms_output.put_line('Furnizorul cu id-ul 113 este '||v_denumire_fur);
END;
/
-- In urma inventarului s-au descoperi plusuri si minusuri in stocuri dupa
cum urmeaza:
-- - CREIOANE MECANICE O.9 + 15 buc
-- - PIX MECANIC ROSU + 75 buc
-- - CARIOCI CARIO - 10 cut
-- - CREIOANE COLORATE MAXI - 45 cut
-- Efectuati modificarile si afisati denumirile produselor si stocurile. Pag | 10
BEGIN
update produse
set stoc=stoc+15
where denumire = 'CREIOANE MECANICE O.9';
update produse
set stoc=stoc+75
where denumire = 'PIX MECANIC ROSU';
update produse
set stoc=stoc-10
where denumire = 'CARIOCI CARIO';
update produse
set stoc=stoc+75
where denumire = 'CREIOANE COLORATE MAXI';
END;
/

select denumire, stoc from produse;

Structuri
Alternativa
-- In tabela RAND_COMANDA_OUT sa se majoreze cantitatea produsului cu codul
111118 cu 25%, daca este mai mică de 100 UM.
set serveroutput on
declare
p_cantitate rand_comanda_out.cantitate_out%type;
Begin
select cantitate_out into p_cantitate from rand_comanda_out
where cod_bare='111118';
if p_cantitate < 100 then
p_cantitate:=1.25*p_cantitate;
end if;
dbms_output.put_line('Cantitatea dupa actualizare este:'||p_cantitate);
end;
/

Repetitiva
/*Să se afişeze numărul de facturi ale fiecărui furnizor al cărui id este
situat în intervalul 101..105, dar să se
întrerupă afişarea în cazul în care se găseşte primul furnizor din acest
interval care nu are nici o factura emisa
*/
set serveroutput on
DECLARE
v_nr number;
v_nume furnizori.denumire_fur%type;
v_id furnizori.id_fur%type;
BEGIN
for v_id in 101..105 loop
v_nr:=0; Pag | 11
SELECT count(c.nr_fact_in) into v_nr from intrari c, furnizori a
where c.id_fur=a.id_fur and a.id_fur=v_id;
dbms_output.put_line('Furnizorul cu id-ul: '||v_id||' are: '||v_nr||'
facturi');
exit when v_nr=0;
end loop;
end;
/

Tratarea excepţiilor
Implicite
--Sa se afiseze numele clientilor din Iasi (verificarea exceptiei)

set serveroutput on
DECLARE
v_nume clienti.nume_client%type;

BEGIN
SELECT nume_client into v_nume from clienti
where adresa_client='Iasi';
dbms_output.put_line(v_nume);

exception
when no_data_found then
dbms_output.put_line('Nu exista clienti din Iasi.');
end;
/

--Sa se afiseze numele clientilor persoana fizica (verificarea exceptiei)

set serveroutput on
DECLARE
v_nume clienti.nume_client%type;

BEGIN
SELECT nume_client into v_nume from clienti
where tip_client='p_juridica';
dbms_output.put_line(v_nume);

exception
when TOO_MANY_ROWS then
dbms_output.put_line('Prea multe randuri!');
end;
/
Explicite
--Sa se numere clientii si sa se afiseze eroare daca sunt mai putin de 20
Pag | 12
set serveroutput on
DECLARE
nr number (2);

BEGIN
SELECT count (*) into nr from clienti;
if nr < 15 then
raise_application_error (-20011, 'Prea putini clienti');
else
dbms_output.put_line('Sunt '||nr||' clienti');
end if;
end;
/

--Sa se numere facturile emise neonorate sau in curs de onorare si sa se


afiseze eroare daca nu se gasesc

set serveroutput on
DECLARE
nr number (2);
data_not_found exception;
BEGIN
SELECT count (*) into nr from iesiri
where stare_marfa_out in ('livrat partial','nelivrat');
if nr < 1 then
dbms_output.put_line('Toate comezile au fost onorate');
else
raise data_not_found;
end if;

exception
when data_not_found then
dbms_output.put_line ('S.C. ABC Birotica S.R.L. are comenzi neonorate');
end;
/

Gestionarea cursorilor
Impliciți
-- Sa se afiseze numarul clientilor de sex feminin.
set serveroutput on
DECLARE
v_nr clienti.id_cli%type;
BEGIN
Select id_cli into v_nr FROM clienti
WHERE cif_cnp like ('2%');
v_nr:=SQL%ROWCOUNT;
DBMS_OUTPUT.PUT_LINE (v_nr || ' clienti de sex feminin');
END;
/

Expliciți Pag | 13

--Sa se afiseze Furnizorii din Bucuresti.

set serveroutput on
declare
cursor c_fur is select id_fur, denumire_fur, adresa_fur from furnizori
where adresa_fur='Bucuresti'
BEGIN
dbms_output.put_line ('furnizorii din bucuresti:');
for i in c_fur loop
dbms_output.put_line ('Furnizorul '||i.denumire_furnizor||' este din: '||
i.adresa_fur);
end loop;
end;
/

Funcţii, proceduri, includerea acestora în pachete


Funcții
-- Sa se scrie o procedura care calculeaza incasarile actuale sau viitoare
ale firmei
set serveroutput on
create or replace function incasari
s number (5.2);
return number;

is
begin
select * from rand_comanda_out;
while sql%found then
s=s+(pret_out * cantitate_out);
exit when sql%notfound;
end loop;
dbms_output.put_line('Incasarile firmei sunt de '||s);
exit;
/

Proceduri
-- Sa se scrie o procedura care sa mareasca stocul unui produs cu un procent
dat
set serveroutput on
create or replace procedure creste_stoc
(codp in produse.cod_bare&type, procent in number)
is
v_stoc produse.stoc%type;
produs_inexistent exception;

BEGIN
update produse
set stoc = stoc * (1+procent/100)
where cod_bare=codpș Pag | 14
if sql%notfound then
raise produs_inexistent;
end if;
dbms_output.put_line('S-au modificat' ||sql%rowcount||' stocuri');
exception
when produs_inexistent then
dbms_output.put_line('Codul cautat nu exista');
end;
/

Pachete
-- Creerea unui pachet care sa contina subprogramele de mai devreme
create or replace package subprograme
is
procedure creste_stoc
(codp in produse.cod_bare&type, procent in number);
function incasari
s number (5.2);
return number;
end;
/

create or replace package body subprograme


is
procedure creste_stoc
(codp in produse.cod_bare&type, procent in number)
is
v_stoc produse.stoc%type;
produs_inexistent exception;

BEGIN
update produse
set stoc = stoc * (1+procent/100)
where cod_bare=codpș
if sql%notfound then
raise produs_inexistent;
end if;
dbms_output.put_line('S-au modificat' ||sql%rowcount||' stocuri');
exception
when produs_inexistent then
dbms_output.put_line('Codul cautat nu exista');
end;
/
function incasari
s number (5.2);
return number;
is
begin
select * from rand_comanda_out;
while sql%found then
s=s+(pret_out * cantitate_out);
exit when sql%notfound;
end loop; Pag | 15
dbms_output.put_line('Incasarile firmei sunt de '||s);
exit;
/
end;
/

Declanşatori
-- la fiecare inserare sau actualizare in tabela rand_comanda_in , coloana
stoc din tabela
-- produse se va actualiza automat prin adunarea la valoarea veche a noii
valori a stocului
create or replace trigger creste_stoc
after insert or update of cantitate_in on rand_comanda_in
for each row
begin
update produse
set stoc=stoc+:new.cantitate_in
where cod_bare=:new.cod_bare;
end creste_stoc;

-- la fiecare inserare sau actualizare in tabela rand_comanda_out , coloana


stoc din tabela
-- produse se va actualiza automat prin scaderea din valoarea veche a noii
valori a stocului
create or replace trigger scade_stoc
after insert or update of cantitate_out on rand_comanda_out
for each row
begin
update produse
set stoc=stoc-:new.cantitate_out
where cod_bare=:new.cod_bare;
end scade_stoc;