Sunteți pe pagina 1din 48

ADASCALITEI IOAN

GRUPA 1026

Proiect SGBD
Descriere proiect:
Proiectul consta in crearea unei baze de date privind informatiile referitoare la
recoltarea probelor de sange in cadrul spitalului Polisano, Sibiu. Am stocat date in
4 tabele, interconectate. Datele stocate se refera la persoana careia i se ia sange
(tabela PERSOANE), grupele sanguine (GRUPE), doctorii la care acestia apeleaza
(tabela DOCTORI), si consultatiile pe care acestia le realizeaza in momentul
recoltarii sangelui (tabela CONSULTATII).
Reguli si structura tabelelor:
La inceput, intre persoane si doctori exista o relatie de tip M:M. Pentru
asigurarea integritatii bazei de date, am creat tabela Consultatii care se leaga de
cele 2 tabele prin doua relatii de tip 1:M. O persoana poate avea o singura grupa
sanguina. Mai multe persoane pot avea aceeasi grupa sanguina. La o consultatie
poate sa participe o singura persoana, dar o persoana poate fi consultata de mai
multe ori. Un doctor poate realiza mai multe consultatii. La o consultatie poate
participa un singur doctor.
Tabelele si schema bazei de date:
Tabela PERSOANE:
Camp
Cod_persoana
Nume_persoana
Prenume_persoan
a
Sex
Data_nasterii
Adresa
Email_persoana

Tip
NUMBER(5)
VARCHAR2(15)
VARCHAR2(20)

Restrictii
Primary Key
Not null
Not null

VARCHAR2(1)
DATE
VARCHAR2(50)
VARCHAR2(30)

Check

Comentarii

ADASCALITEI IOAN
Telefon
Cod_grupa

GRUPA 1026

VARCHAR2(15)
NUMBER(5)

Not null
Foreign key, not
null

Tip
NUMBER(5)
VARCHAR2(4)

Restrictii
Primary key
Not null

Tip
NUMBER(5)
VARCHAR2(15)
VARCHAR2(20)
VARCHAR2(50)
VARCHAR2(30)
VARCHAR2(15)

Restrictii
Primary key
Not null
Not null

Cheie externa catre


tabela PERSOANE.
Fiecare perosoana are
o grupa sanguina.

Tabela GRUPE:
Camp
Cod_grupa
Nume_grupa

Comentarii

Tabela DOCTORI:
Camp
Cod_doctor
Nume_doctor
Prenume_doctor
Adresa_doctor
Email_doctor
Telefon_doctor

Comentarii

Check

Tabela CONSULTATII:
Camp
Cod_consultatie
Data_consultatie
Cod_persoana

Tip
NUMBER(5)
DATE
NUMBER(5)

Restrictii
Primary key
Not null
Foreign key

Cod_doctor

NUMBER(5)

Foreign key

Comentarii
Cheie externa
catre Persoane
Cheie externa
catre Doctori

ADASCALITEI IOAN

GRUPA 1026

Schema bazei de date in format FN3:


PERSOANE
Cod_persoana
Nume_persoana
Prenume_persoan
a
Sex
Data_nasterii
Adresa
Email_persoana
Telefon GRUPE
Cod_grupa
Cod_grupa
Nume_grupa

CONSULTATII
Cod_consultatie
Data_consultatie
Cod_persoana
Cod_doctor

DOCTORI
Cod_doctor
Nume_doctor
Prenume_doctor
Adresa_doctor
Email_doctor
Telefon_doctor

Crearea tabelelor:
Cerina:
S se creeze tabelele PERSOANE, GRUPE, DOCTORI SI CONSULTATII pe baza
structurii si tipurilor de date prezentate mai sus.
CREATE TABLE PERSOANE (cod_persoana NUMBER(5) PRIMARY KEY,
nume_persoana VARCHAR2(15) NOT NULL, prenume_persoana VARCHAR2(20) NOT
NULL, sex VARCHAR2(1), data_nasterii DATE, adresa VARCHAR2(50), email_persoana

ADASCALITEI IOAN

GRUPA 1026

VARCHAR2(30), telefon VARCHAR2(15) NOT NULL, CONSTRAINT ck1 CHECK


(email_persoana LIKE '%@%.%'), cod_grupa REFERENCES GRUPE(cod_grupa));

Column Name

Data Type

Nullable

COD_PERSOANA

NUMBER(5,0)

No

NUME_PERSOANA

VARCHAR2(15)

No

PRENUME_PERSOANA

VARCHAR2(20)

No

SEX

VARCHAR2(1)

Yes

DATA_NASTERII

DATE

Yes

ADRESA

VARCHAR2(50)

Yes

EMAIL_PERSOANA

VARCHAR2(30)

Yes

TELEFON

VARCHAR2(15)

No

COD_GRUPA

NUMBER(5,0)

Yes

Default

Primary
Key
1

CREATE TABLE GRUPE (cod_grupa NUMBER(5) PRIMARY KEY,


nume_grupa VARCHAR2(4) NOT NULL);
Column Name

Data Type

Nullable

COD_GRUPA

NUMBER(5,0)

No

NUME_GRUPA

VARCHAR2(4)

No

Default

Primary
Key
1

CREATE TABLE DOCTORI (cod_doctor NUMBER(5) PRIMARY KEY,


nume_doctor VARCHAR2(15) NOT NULL, prenume_doctor VARCHAR2(20)
NOT NULL, adresa_doctor VARCHAR2(50), email_doctor VARCHAR2(30),
telefon_doctor VARCHAR2(15) NOT NULL, CONSTRAINT ck2 CHECK
(email_doctor LIKE '%@%.%'));
Column Name

Data Type

Nullable

COD_DOCTOR

NUMBER(5,0)

No

NUME_DOCTOR

VARCHAR2(15)

No

PRENUME_DOCTOR

VARCHAR2(20)

No

ADRESA_DOCTOR

VARCHAR2(50)

Yes

EMAIL_DOCTOR

VARCHAR2(30)

Yes

TELEFON_DOCTOR

VARCHAR2(15)

No

Default

Primary
Key
1

ADASCALITEI IOAN

GRUPA 1026

CREATE TABLE CONSULTATII (cod_consultatie NUMBER(5), data_consultatie


DATE NOT NULL, cod_persoana NUMBER(5) REFERENCES
PERSOANE(cod_persoana), cod_doctor REFERENCES DOCTORI(cod_doctor),
CONSTRAINT ck3 CHECK(cod_persoana IS NOT NULL), CONSTRAINT ck4
CHECK(cod_doctor IS NOT NULL));
Column Name

Data Type

Nullable

COD_CONSULTATIE

NUMBER(5,0)

Yes

DATA_CONSULTATIE

DATE

No

COD_PERSOANA

NUMBER(5,0)

Yes

COD_DOCTOR

NUMBER(5,0)

Yes

Default

Adaugarea inregistrarilor in tabele:


PENTRU TABELA GRUPA:
INSERT INTO GRUPE(cod_grupa, nume_grupa) VALUES (140, '0')
INSERT INTO GRUPE(cod_grupa, nume_grupa) VALUES (141, 'A')
INSERT INTO GRUPE(cod_grupa, nume_grupa) VALUES (142, 'B')
INSERT INTO GRUPE(cod_grupa, nume_grupa) VALUES (143, 'AB')

PENTRU TABELA PERSOANE:


INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES (1000,
'Muja', 'Stefan-Andrei', 'M',TO_DATE('20.09.1994', 'DD.MM.YYYY'), 'Ramnicu
Valcea', 'andrei.raiden20@gmail.com', '0766361429', 140)

Primary
Key

ADASCALITEI IOAN

GRUPA 1026

INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,


sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES (1001,
'Chitu', 'Robert-Ionut', 'M',TO_DATE('07.01.1996', 'DD.MM.YYYY'), 'Ramnicu
Valcea', 'robby.nebunu@gmail.com', '0751626362', 141)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES (1002,
'Vinereanu', 'Razvan-Nicolae', 'M',TO_DATE('30.10.1996', 'DD.MM.YYYY'),
'Ramnicu Valcea', 'razhi.vl08@gmail.com', '0755317122', 140)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES (1003,
'Grecu', 'Andreea-Beatrice', 'F',TO_DATE('21.12.1992', 'DD.MM.YYYY'),
'Bucuresti', 'deea.grecu@gmail.com', '0780766894', 143)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1004,
'Usurelu', 'Daniel-Constantin', 'M',TO_DATE('05.10.1995', 'DD.MM.YYYY'),
'Cluj-Napoca', 'dani.scaparici@gmail.com', '0752531875', 142)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES (1005,
'Mlisan', 'Ryad', 'M',TO_DATE('13.08.1998', 'DD.MM.YYYY'), 'Timisoara',
'ryry.boss@gmail.com', '0749302245', 140)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1006,
'Poenaru', 'Gabriel', 'M',TO_DATE('07.09.1996', 'DD.MM.YYYY'), 'Sibiu',
'gaby.zgabina@gmail.com', '0742901230', 141)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES (1007,
'Raducu', 'Ioan-Mircea', 'M',TO_DATE('12.05.1994', 'DD.MM.YYYY'),
'Bucuresti', 'beliar.king@gmail.com', '0723125647', 142)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1008,
'Velcu', 'Endy-Robert', 'M',TO_DATE('18.10.1994', 'DD.MM.YYYY'), 'Bucuresti',
'endy.boss@gmail.com', '0734128769', 143)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1009,

ADASCALITEI IOAN

GRUPA 1026

'Paleu', 'Stefan-Andrei', 'M',TO_DATE('08.10.1995', 'DD.MM.YYYY'), 'Sibiu',


'steffy.paleu@gmail.com', '0746481334', 140)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1010,
'Stelea', 'Bogdan-Marian', 'M',TO_DATE('21.10.1991', 'DD.MM.YYYY'),
'Constanta', 'bogy.stelea@gmail.com', '0767123908', 142)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1011,
'Dura', 'Alexandru', 'M',TO_DATE('19.05.1992', 'DD.MM.YYYY'), 'Sibiu',
'dura.dura@gmail.com', '072905230', 140)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1012,
'Duca', 'Flavius-Alin', 'M',TO_DATE('13.07.1991', 'DD.MM.YYYY'), 'Sibiu',
'flavio.duca@gmail.com', '0729124906', 141)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1013,
'Jurca', 'Daiana-Nicole', 'F',TO_DATE('07.12.1995', 'DD.MM.YYYY'), 'Oradea',
'day.jurca09@gmail.com', '0671830197', 140)
INSERT INTO PERSOANE(cod_persoana, nume_persoana, prenume_persoana,
sex, data_nasterii, adresa, email_persoana, telefon, cod_grupa) VALUES(1014,
'Mocanu', 'Radu-Anton', 'M',TO_DATE('19.10.1991', 'DD.MM.YYYY'), 'Ramnicu
Valcea', 'radu.anton@gmail.com', '0729035781', 143)

ADASCALITEI IOAN

GRUPA 1026

PENTRU TABELA DOCTORI:


INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (100, 'Bizant', 'Leontin',
'Bucuresti', 'bizantl@gmail.com', '07662283398')
INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (101, 'Calota', 'Virgil',
'Sibiu', 'virgil.calota@gmail.com', '0756278592)
INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (102, 'Dumbravescu',
'Emil', 'Ploiesti', 'dumbraemil@gmail.com', '0723678129')
INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (103, 'Enache', 'George',
'Constanta', 'enacheg@gmail.com', '0748498490')
INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (104, 'Galmeanu', 'Horia',
'Targoviste', 'galma.h@gmail.com', '0756721399')

ADASCALITEI IOAN

GRUPA 1026

INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,


adresa_doctor, email_doctor, telefon_doctor) VALUES (105, 'Helesteanu',
'Cosmin', 'Targu Jiu', 'helesteanu@gmail.com', '0745689901')
INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (106, 'Izmailov',
'Hariontiu', 'Sfantu-Gheorghe', 'izma.hari@gmail.com', '0760123890')
INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (107, 'Paraschiv', 'Ovidiu',
'Iasi', 'ovidiu.paraschiv@gmail.com', '0723123789')
INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (108, 'Richiteanu', 'Tudor',
'Timisoara', 'tudor.richitz@gmail.com', '0782345130')
INSERT INTO DOCTORI(cod_doctor, nume_doctor, prenume_doctor,
adresa_doctor, email_doctor, telefon_doctor) VALUES (109, 'Stanescu', 'Vasile',
'Clu-Napoca', 'stane.vasile@gmail.com', '0773619014')

PENTRU TABELA CONSULTATII:


INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (401, TO_DATE('12.03.2015', 'DD.MM.YYYY'), 1000,
103)

ADASCALITEI IOAN

GRUPA 1026

INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,


cod_doctor) VALUES (402, TO_DATE('13.03.2015', 'DD.MM.YYYY'), 1005,
101)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (403, TO_DATE('14.03.2015', 'DD.MM.YYYY'), 1002,
109)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (404, TO_DATE('15.03.2015', 'DD.MM.YYYY'), 1007,
100)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (405, TO_DATE('16.03.2015', 'DD.MM.YYYY'), 1010,
103)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (406, TO_DATE('17.03.2015', 'DD.MM.YYYY'), 1012,
104)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (407, TO_DATE('18.03.2015', 'DD.MM.YYYY'), 1014,
108)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (408, TO_DATE('19.03.2015', 'DD.MM.YYYY'), 1013,
102)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (409, TO_DATE('20.03.2015', 'DD.MM.YYYY'), 1007,
105)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (410, TO_DATE('21.03.2015', 'DD.MM.YYYY'), 1006,
108)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (411, TO_DATE('22.03.2015', 'DD.MM.YYYY'), 1011,
106)
INSERT INTO CONSULTATII(cod_consultatie, data_consultatie, cod_persoana,
cod_doctor) VALUES (412, TO_DATE('23.03.2015', 'DD.MM.YYYY'), 1004,
107)

ADASCALITEI IOAN

GRUPA 1026

B.Interaciunea cu serverul Oracle prin intermediul


comenzilor SQL(LDD I LMD)
1. S se selecteze numele i telefonul doctorului care este din Constana.
declare
v_nume doctori.nume_doctor%type;
v_telefon doctori.telefon_doctor%type;
begin
select nume_doctor, telefon_doctor into v_nume, v_telefon from doctori
where adresa_doctor='Constanta';

ADASCALITEI IOAN

GRUPA 1026

dbms_output.put_line('Doctorul ' || v_nume|| ' are nr de telefon: ' || v_telefon);


end;
/

2. S se afle sexul persoanei cu codul de 1014.


Declare
V_sex persoane.sex%type;
V_nume persoane.nume_persoana%type;
Begin
Select sex, nume_persoana into v_sex, v_nume from persoane
Where cod_persoana=1014;
Dbms_output.put_line(' Persoana '|| v_nume||' are sexul '||v_sex);
End;
/

ADASCALITEI IOAN

GRUPA 1026

3. Se creaz tabela pers n cadrul unui bloc pl/sql. i se adaug nregistrri din
tabela persoane.
begin
execute immediate 'CREATE table pers AS SELECT * FROM persoane where
1=2';
end;
/

ADASCALITEI IOAN

GRUPA 1026

--adaugarea inregistarii
declare
v_cod persoane.cod_persoana%type;
v_nume persoane.nume_persoana%type;
v_prenume persoane.prenume_persoana%type;
v_sex persoane.sex%type;
v_data persoane.data_nasterii%type;
v_adresa persoane.adresa%type;
v_email persoane.email_persoana%type;
v_tel persoane.telefon%type;
v_codgr persoane.cod_grupa%type;

ADASCALITEI IOAN

GRUPA 1026

begin
select cod_persoana,
nume_persoana,prenume_persoana,sex,data_nasterii,adresa,email_persoana,telefon
,cod_grupa into
v_cod,v_nume,v_prenume,v_sex,v_data,v_adresa,v_email,v_tel,v_codgr from
persoane
where cod_persoana=1000;
insert into pers (cod_persoana,
nume_persoana,prenume_persoana,sex,data_nasterii,adresa,email_persoana,telefon
,cod_grupa)
values(v_cod,v_nume,v_prenume,v_sex,v_data,v_adresa,v_email,v_tel,v_codgr);
dbms_output.put_line('S-a adaugat in tabela pers persoana: '||v_cod||' '||v_nume||' '||
v_prenume||' '||v_sex||' '||v_data||' '||v_adresa||' '||v_email||' '||v_tel||' '||v_codgr);
end;
/

4.S se adauge o nou coloan n tabela Grupe.

ADASCALITEI IOAN

GRUPA 1026

DECLARE
V_SIR VARCHAR2(200);
BEGIN
V_SIR:='ALTER TABLE grupe ADD (RH varchar2 (50))';
DBMS_OUTPUT.PUT_LINE (V_SIR);
EXECUTE IMMEDIATE V_SIR;
END;
/

5. Se adaug o nou nregistrare n tabela grupe.


BEGIN
INSERT INTO grupe(cod_grupa, nume_grupa)
VALUES (144, 'C');

ADASCALITEI IOAN

GRUPA 1026

END;
/

6. S se modifice codul unuia dintre doctori, la alegere.


declare
v_cod number;
begin
update doctori
set cod_doctor=cod_doctor+1
where cod_doctor=110;
end;
/

ADASCALITEI IOAN

GRUPA 1026

7.S se tearg grupa nou creat de mai sus.


declare
begin
delete from grupe where cod_grupa=144;
end;
/

ADASCALITEI IOAN

GRUPA 1026

8. S se afieze numele doctorului i al persoanei care au consultaia cu codul 403.


declare
v_numeP persoane.nume_persoana%type;
v_numeD doctori.nume_doctor%type;
v_cod consultatii.cod_consultatie%type;
begin
select nume_persoana, nume_doctor,cod_consultatie into v_numeP, v_numeD,
v_cod from persoane p, doctori d, consultatii c
where p.cod_persoana=c.cod_persoana and d.cod_doctor=c.cod_doctor and
c.cod_consultatie=403;
dbms_output.put_line('Persoana '||v_numeP||' si doctorul '||v_numeD||' au
consultatia cu codul de: '||v_cod);
end;

ADASCALITEI IOAN

GRUPA 1026

9. Folosirea unui tip record pentru selectarea numelui i adresei unei persoane.
DECLARE
vrec_pers persoane%rowtype;
BEGIN
SELECT * into vrec_pers from persoane where cod_persoana=1003;
dbms_output.put_line('Persoana: '|| vrec_pers.nume_persoana|| ' sta in: '||
vrec_pers.adresa);

ADASCALITEI IOAN

GRUPA 1026

C.Structuri alternative i repetitive


1. S se afieze toate persoanele folosind o structur de tip for.
declare
v_min persoane.cod_persoana%type;
v_max persoane.cod_persoana%type;
v_nume persoane.nume_persoana%type;
begin
select min(cod_persoana), max(cod_persoana) into v_min, v_max from persoane;
for i in v_min..v_max
loop
select nume_persoana into v_nume from persoane where cod_persoana=i;

ADASCALITEI IOAN

GRUPA 1026

dbms_output.put_line(v_nume);
end loop;
end;
/

2.Afiai toi doctorii folosind o structur while.


declare
i doctori.cod_doctor%type;
v_min doctori.cod_doctor%type;
v_max doctori.cod_doctor%type;
v_nume doctori.nume_doctor%type;
begin
select min(cod_doctor),max(cod_doctor) into v_min, v_max from doctori;

ADASCALITEI IOAN

GRUPA 1026

i:=v_min;
while (i<=v_max)
loop
select nume_doctor into v_nume from doctori
where cod_doctor=i;
i:=i+1;
dbms_output.put_line(v_nume);
end loop;
end;
/

3.Folosind un loop, afiai doar persoanele cu grupa mai mic dect numrul ce
reprezint media grupelor(codurilor lor).

ADASCALITEI IOAN

GRUPA 1026

DECLARE
v_cod persoane.cod_grupa%type;
v_codMediu v_cod%type;
i number(6):=1000;
BEGIN
SELECT avg(cod_grupa) into v_codMediu from persoane;
dbms_output.put_line('Media aritmetica a codurilor grupelor este: '||v_codMediu);
loop
select cod_grupa into v_cod from persoane where cod_persoana=i;
dbms_output.put_line('Persoana cu codul '||i||' are grupa: '||v_cod);
i:=i+1;
exit when v_cod<v_codMediu or i>1014;
end loop;
end;
/

ADASCALITEI IOAN

GRUPA 1026

4. S se afieze numrul de consultatii ale fiecrui doctor al crui id este situat n


intervalul 100-109, dar s se ntrerup afiarea n cazul n care se gsete primul
doctor din acest interval care nu are nici o consultatie:
DECLARE
v_nr number;
v_cod doctori.cod_doctor%type;
BEGIN
for v_id in 100..109 loop
v_nr:=0;
SELECT count(c.cod_consultatie) into v_nr from consultatii c,doctori d
where c.cod_doctor=d.cod_doctor and d.cod_doctor=v_cod;
dbms_output.put_line('Doctorul cu codul : '||v_cod||' are: '||v_nr||' consultatii');

ADASCALITEI IOAN

GRUPA 1026

exit when v_nr=0;


end loop;
end;
/

5. S se calculeze noul indice folosind case pentru persoana/persoanele care are la


telefon cifra a 3-a 8.
declare
v_cod persoane.cod_grupa%type;
begin
select cod_grupa into v_cod from persoane where telefon like '__8%';
case
when v_cod<140 then v_cod:=v_cod-1;

ADASCALITEI IOAN

GRUPA 1026

when v_cod between 140 and 143 then v_cod:=v_cod*2;


else v_cod:=0;
end case;
dbms_output.put_line('Noul indice al grupei este '||v_cod);
end;
/

D.Tratarea excepiilor implicite i explicite.


1.S se afieze numrul de consultaii ale doctorului care are numele de
Richieanu.
declare
v_nume doctori.nume_doctor%type;
v_cod consultatii.cod_consultatie%type;

ADASCALITEI IOAN

GRUPA 1026

begin
select nume_doctor, cod_consultatie into v_nume, v_cod from doctori, consultatii
where doctori.cod_doctor=consultatii.cod_doctor and
doctori.nume_doctor='richiteanu';
exception
when TOO_MANY_ROWS then dbms_output.put_line('Doctorul are mai multe
consultatii');
when NO_DATA_FOUND then dbms_output.put_line('Lipsa date necesare');
when others then dbms_output.put_line('Alte probleme aparute');
end;
/

2. S se afieze persoana cu codul 1016. Dac nu e, s se trateze excepia aprut.


DECLARE

ADASCALITEI IOAN

GRUPA 1026

v_nume varchar2(40);
BEGIN
SELECT nume_persoana INTO v_nume
FROM persoane
WHERE cod_persoana=1016;
dbms_output.put_line(v_nume);
EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_output.put_line('Nu exista persoana cu acest cod');
END;
/

ADASCALITEI IOAN

GRUPA 1026

3.Modificai numele doctorului cu id =113. Dac nu s-a modificat nimic sau apare
vreo eroare, s se trateze cu o excepie de avertizare.
DECLARE
invalid EXCEPTION;
BEGIN
UPDATE doctori
SET nume_doctor='DOTTORE'
WHERE cod_doctor=113;
IF SQL%NOTFOUND THEN
RAISE invalid;
END IF;
EXCEPTION
WHEN invalid THEN
DBMS_OUTPUT.PUT_LINE('Nu exista doctorul cu acest cod');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('A aparut o eroare! Nu se poate actualiza denumirea
produsului!');
END;
/

ADASCALITEI IOAN

GRUPA 1026

4.S se insereze n grup o nou grup de snge cu cod 147 si null. S se trateze
excepia aprut.
DECLARE
INSERARE EXCEPTION;
PRAGMA EXCEPTION_INIT(INSERARE, -01400);
BEGIN
insert into grupe (cod_grupa, nume_grupa) values (147, NULL);
EXCEPTION
WHEN INSERARE THEN
DBMS_OUTPUT.PUT_LINE('Nu ati precizat informatii suficiente pentru grupe');
DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;
/

ADASCALITEI IOAN

GRUPA 1026

E. Cursori implicii i explicii.


1. S se afieze codul i telefonul doctorului i localitatea de unde provine acesta.
declare
cursor c is select nume_doctor, cod_doctor, telefon_doctor from doctori;
v_localitate doctori.adresa_doctor%type;
begin
for r in c
loop
select adresa_doctor into v_localitate from doctori where
cod_doctor=r.cod_doctor;
dbms_output.put_line(r.nume_doctor||' are codul: '||r.cod_doctor||' si telefonul '||
r.telefon_doctor||' si este din '||v_localitate);

ADASCALITEI IOAN

GRUPA 1026

end loop;
end;
/

2.S se selecteze folosind un cursor numele i prenumele persoanelor care au doar


grupa universal 0.
declare
cursor c is select c.nume_persoana, c.prenume_persoana, g.nume_grupa from
persoane c, grupe g
where c.cod_grupa=g.cod_grupa and nume_grupa like '%0%'
order by c.nume_persoana;
begin
for r in c
loop

ADASCALITEI IOAN

GRUPA 1026

dbms_output.put_line(r.nume_persoana || r.prenume_persoana||' are grupa


universala avand numele: '||r.nume_grupa);
end loop;
end;
/

3. Facei un cursor explicit folosind o variabil de tip record pentru numele i


mailul celor cu grupa 142.
declare
cursor pers_cursor is select nume_persoana, email_persoana from persoane where
cod_grupa=142;
pers_rec pers_cursor%rowtype;
begin
dbms_output.put_line('Lista cu persoanele avand codul grupei de 142');

ADASCALITEI IOAN

GRUPA 1026

open pers_cursor;
loop
fetch pers_cursor into pers_rec;
exit when pers_cursor%notfound;
dbms_output.put_line('Salariatul '||pers_rec.nume_persoana||' are email-ul '||
pers_rec.email_persoana);
end loop;
close pers_cursor;
end;
/

4. S se modifice email-ul persoanei cu codul 1019. Dac nu, sa se foloseasca un


cursor implicit.
BEGIN

ADASCALITEI IOAN

GRUPA 1026

UPDATE persoane
SET email_persoana='ralph.meyers@yahoo.com'
WHERE cod_persoana=1019;
IF SQL%NOTFOUND THEN
DBMS_OUTPUT.PUT_LINE('Nu exista persoana cu acest cod');
END IF;
END;
/

5. S se afieze doctorii a cror sum a codurilor de consultaii sunt mai mari dect
o valoare dat drept parametru.
DECLARE
CURSOR c_pers (p_val NUMBER) IS

ADASCALITEI IOAN

GRUPA 1026

SELECT p.cod_doctor, p.nume_doctor, sum(r.cod_consultatie) suma_cod


FROM doctori p, consultatii r
WHERE p.cod_doctor =r.cod_doctor
GROUP BY p.cod_doctor, p.nume_doctor
HAVING sum(r.cod_consultatie)>p_val
order by suma_cod desc;
v_val NUMBER(5);
r_pers c_pers%rowtype;
BEGIN
v_val:=404;
DBMS_OUTPUT.PUT_LINE('Doctorii al caror cod de consultatie este mai mare
decat '|| v_val);
IF NOT c_pers%ISOPEN THEN
OPEN c_pers (v_val);
END IF;
LOOP
FETCH c_pers into r_pers;
EXIT WHEN c_pers%notfound;
DBMS_OUTPUT.PUT_LINE('Doctorul '||r_pers.cod_doctor||', '||
r_pers.nume_doctor||' are suma codurilor de ' ||r_pers.suma_cod||' unitati');
END LOOP;
CLOSE c_pers;
END;
/

ADASCALITEI IOAN

GRUPA 1026

F.Funcii, proceduri, pachete.


1. S se creeze un pachet ce conine o funcie care calculeaz vrsta n zile a unei
persoane i adugarea unei noi persoane.
create or replace package pachet as
procedure adauga_persoana(cod in persoane.cod_persoana%type, nume in
persoane.nume_persoana%type, prenume in persoane.prenume_persoana%type,
sex in persoane.sex%type, data in DATE,
adresa in persoane.adresa%type, email in persoane.email_persoana%type, tel in
persoane.telefon%type, codG in persoane.cod_grupa%type);
function varsta(id persoane.cod_persoana%type)return number;
end;
/

ADASCALITEI IOAN

GRUPA 1026

create or replace package body pachet as


procedure adauga_persoana(cod in persoane.cod_persoana%type, nume in
persoane.nume_persoana%type, prenume in persoane.prenume_persoana%type,
sex in persoane.sex%type, data in DATE,
adresa in persoane.adresa%type, email in persoane.email_persoana%type, tel in
persoane.telefon%type, codG in persoane.cod_grupa%type)
as
begin
insert into persoane values(cod,nume,prenume,sex,data,adresa,email,tel,codG);
exception
when dup_val_on_index then dbms_output.put_line('Deja exista persoana
aceasta');
end;

ADASCALITEI IOAN

GRUPA 1026

function varsta(id persoane.cod_persoana%type)return number


as
varsta number;
begin
select(sysdate-data_nasterii)/365 into varsta from persoane where
cod_persoana=id;
return varsta;
exception
when no_data_found then return 0;
end;
end;
/

ADASCALITEI IOAN

GRUPA 1026

Pentru exemplificare:
begin
pachet.adauga_persoana(1023,'Nemtoiu','Tudor','M',sysdate,'Tulcea','t.nemtoiu@g
mail.com',0764302309,140);
end;
/
Select* from persoane where cod_persoana=1023;
2. S se creeze un pachet ce conine o procedur de tergere a unei persoane din
tabela pers i o funcie ce afieaz cte consultaii a avut acea persoana.
create or replace package consult
as
procedure sterge(cod pers.cod_persoana%type);
function nr_consultatii(codC consultatii.cod_doctor%type) return number;

ADASCALITEI IOAN

GRUPA 1026

end;
/

create or replace package body consult


as
procedure sterge(cod pers.cod_persoana%type)
as
begin
delete from pers where cod_persoana=cod;
end;
function nr_consultatii(codC consultatii.cod_doctor%type) return number
as

ADASCALITEI IOAN

GRUPA 1026

numar number;
begin
select count(cod_consultatie) into numar from consultatii where cod_doctor=codC;
end;
end;
/

3. S se creeze o funcie care returneaz true dac pers e din Ramnicu Valcea sau
nu.
CREATE OR REPLACE FUNCTION verifica_loc
(codP in persoane.cod_persoana%type, loc in persoane.adresa%type)
RETURN Boolean

ADASCALITEI IOAN

GRUPA 1026

IS
v_loc persoane.adresa%type;
BEGIN
SELECT adresa into v_loc from persoane where cod_persoana=codP;
IF loc ='Ramnicu Valcea' then
return true;
ELSE
return false;
end if;
EXCEPTION
WHEN no_data_found THEN
return NULL;
end;
/

ADASCALITEI IOAN

GRUPA 1026

G.Declanatori/triggeri.
1. S se creeze un declanator pentru cnd are loc un update sau insert sau delete al
codului consultaiei.
create or replace trigger schimbare
before insert or update or delete on consultatii
begin
case
when inserting then dbms_output.put_line('S-a inserat');
when updating then dbms_output.put_line('S-a updatat');
else dbms_output.put_line('S-a sters');
end case;
end;

ADASCALITEI IOAN

GRUPA 1026

2. S se foloseasc un trigger pentru modificarea sau inserarea unui email unui


doctor.
create or replace trigger mod
before insert or update or delete on doctori
begin
case
when inserting then dbms_output.put_line('S-a inserat un nou atribut ');
when updating then dbms_output.put_line('S-a updatat un nou atribut ');
else dbms_output.put_line('S-a sters un nou atribut ');
end case;
end;

ADASCALITEI IOAN

GRUPA 1026

H.Aplicatia APEX
1.Paginile aplicatiei

2.Validare cod_persoana

ADASCALITEI IOAN

GRUPA 1026

3.Filtru dupa cod_doctor=100

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