Sunteți pe pagina 1din 40

Proiect SGBD

Mitrea Alexia 1075B

1. Descrierea bazei de date

Obiectivul acestei bazei de date este acela de a avea o gestionare mai eficientă în cadrul unui
spital, având în vedere complexitatea colecției de date stocate.

Prin această gestionare a bazei de date pentru un spital, putem aloca mai ușor resursele pentru
pacienți, putem avea o flexibilitate mai mare privind împărțirea angajaților pe secții, putem accesa
mai repede informații despre un anumit pacient sau despre anumite saloane.

Din punct de vedere economic, consider a fi avantajos să abordez această temă pentru a o
supune analizei.

Așadar, pentru a putea găsi informații relevante cu privire la o altfel de instituție, avem nevoie
de informații referitoare la angajați și funcțiile ocupate de aceștia, împărțiți pe secții, pacienți.

Pentru a realiza tema am creat următoarele tabele:

• angajatii
• alocari_angajati
• fisa_pacient
• sectii
• pacienti
2. Schema bazei de date

3. Crearea tabelelor și adăugarea datelor


create table angajatii
(id_angajat varchar2(4) constraint pk_angajati primary key,
nume_angajat varchar2(30) not null,
prenume_angajat varchar2(30) not null,
data_angajarii date not null,
salariu_angajat number(4,3) not null);
create table sectii
(
id_sectie varchar2(4) constraint pk_sectii primary key,
nume_sectie varchar2(30) not null,
etaj_sectie varchar2(2) not null,
numar_saloane varchar2(3) not null,
responsabil_sectie varchar2(30) not null
);
create table alocari_angajati
(
id_angajat varchar2(4),
constraint fk_alocari1 foreign key(id_angajat) references angajatii(id_angajat),
id_sectie varchar2(4),
constraint fk_alocari2 foreign key(id_sectie) references sectii(id_sectie),
functie_angajat varchar2(30) not null
);
create table pacienti
(
id_pacient varchar2(4) constraint pk_pacienti primary key,
prenume_pacient varchar2(30) not null,
nume_pacient varchar2(30) not null
);
create table fisa_pacient
(
id_pacient varchar2(4),
constraint fk_pacient foreign key(id_pacient) references pacienti(id_pacient),
id_sectie varchar2(4),
constraint fk_sectie foreign key(id_sectie) references sectii(id_sectie),
data_internarii date,
data_externarii date
);

alter table angajatii


modify(salariu_angajat number(5));
alter table sectii drop column responsabil_sectie;
alter table sectii
modify(numar_saloane varchar2(10));
update sectii
set numar_saloane ='5 saloane'
where id_sectie= 1204;
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('010', 'Popescu', 'Andreea', to_date('15-02-2021', 'dd-mm-yyyy'), 2700);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('011', 'Ionescu', 'Madalin', to_date('26-01-2020', 'dd-mm-yyyy'), 3100);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('012', 'Ceapa', 'Irina', to_date('16-05-2011', 'dd-mm-yyyy'), 3800);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('013', 'Mircu', 'Madalin', to_date('26-01-2011', 'dd-mm-yyyy'), 3100);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('014', 'Calinescu', 'Bogdan', to_date('19-02-2019', 'dd-mm-yyyy'), 3500);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('015', 'Iacob', 'Mihaela', to_date('02-12-2010', 'dd-mm-yyyy'), 3700);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('016', 'Mot', 'Emanuela', to_date('08-07-2013', 'dd-mm-yyyy'), 3200);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('017', 'Ion', 'Teodor', to_date('20-10-2018', 'dd-mm-yyyy'), 2900);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('018', 'Naparu', 'George', to_date('03-04-2020', 'dd-mm-yyyy'), 3500);

insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,


salariu_angajat)
values ('019', 'Dragu', 'Alina', to_date('14-01-2017', 'dd-mm-yyyy'), 3600);
insert into angajatii (id_angajat, nume_angajat, prenume_angajat, data_angajarii,
salariu_angajat)
values ('020', 'Neagu', 'Andrei', to_date('22-01-2011', 'dd-mm-yyyy'), 3100);
select * from angajatii;
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1200', 'Pediatrie', '1', '5');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1201', 'Ginecologie', '1', '3');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1202', 'Maternitate', '4', '8');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1203', 'Chirurgie', '3', '6');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1204', 'Dermatologie', '2', '4');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1205', 'Oftalmologie', '3', '4');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1206', 'Ortopedie', '4', '3');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1207', 'Terapie intensiva', '2', '6');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1208', 'Medicina interna', '4', '5');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1209', 'Boli infectioase', '1', '5');
insert into sectii (id_sectie, nume_sectie, etaj_sectie, numar_saloane)
values ('1210', 'Reumatologie', '2', '2');
select * from sectii;
insert into pacienti (id_pacient, prenume_pacient, nume_pacient)
values ('511', 'Ion', 'Catalin');
insert into pacienti (id_pacient, prenume_pacient, nume_pacient)
values ('512', 'David', 'Petrescu');
insert into pacienti (id_pacient, prenume_pacient, nume_pacient)
values ('513', 'Marius', 'Popa');
insert into pacienti (id_pacient, prenume_pacient, nume_pacient)
values ('514', 'Andrei', 'Curca');
insert into pacienti (id_pacient, prenume_pacient, nume_pacient)
values ('515', 'Alexandra', 'Matei');
select * from pacienti;
insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)
values ('506', '1201', to_date('13-07-2021', 'dd-mm-yyyy'), to_date('26-07-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('507', '1202', to_date('12-09-2021', 'dd-mm-yyyy'), to_date('20-09-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('508', '1203', to_date('01-10-2021', 'dd-mm-yyyy'), to_date('05-10-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('509', '1204', to_date('10-03-2021', 'dd-mm-yyyy'), to_date('20-03-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('510', '1205', to_date('12-09-2021', 'dd-mm-yyyy'), to_date('20-09-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('511', '1206', to_date('22-11-2021', 'dd-mm-yyyy'), to_date('25-11-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('512', '1207', to_date('15-07-2021', 'dd-mm-yyyy'), to_date('20-07-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('513', '1208', to_date('03-04-2021', 'dd-mm-yyyy'), to_date('10-04-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('514', '1209', to_date('02-01-2021', 'dd-mm-yyyy'), to_date('20-01-2021', 'dd-mm-
yyyy'));

insert into fisa_pacient (id_pacient, id_sectie, data_internarii, data_externarii)


values ('515', '1210', to_date('13-08-2021', 'dd-mm-yyyy'), to_date('20-08-2021', 'dd-mm-
yyyy'));

select* from fisa_pacient;


insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)
values ('010', '1200', 'ingrijitoare');
insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)
values ('011', '1201', 'asistent principal');

insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)


values ('012', '1202', 'infirmiera');

insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)


values ('013', '1203', 'kinetoterapeut');

insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)


values ('014', '1204', 'medic chirurg');

insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)


values ('015', '1205', 'medic ginecolog');
insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)
values ('016', '1206', 'medic dermatolog');

insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)


values ('017', '1207', 'asistent principal');

insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)


values ('018', '1208', 'cardiolog');

insert into alocari_angajati (id_angajat, id_sectie, functie_angajat)


values ('019', '1209', 'medic oftalmolog');

select * from alocari_angajati;


4. Blocuri PL/SQL conținând structuri de control variate (4 exemple)

1. Sa se parcurga sectiile de la 1200 la 1204.


DECLARE
v_etaj_sectie NUMBER;
v_nr_saloane NUMBER;
BEGIN
FOR i IN 1200..1204 LOOP
SELECT etaj_sectie, numar_saloane
INTO v_etaj_sectie, v_nr_saloane
FROM sectii
WHERE id_sectie=i;
DBMS_OUTPUT.PUT_LINE(v_etaj_sectie||' '||v_nr_saloane);
END LOOP;
END;
2. Se citește de la tastatură un id al unei sectii. Să se afișeze numărul de saloane inițial
al acesteia și să se introducă într-o variabilă numărul modificat astfel: dacă
numărul inițial este mai mic de 5, se introduce 4*nr de saloneș dacă numărul inițial
este cuprins între 5 si 10, se introduce 3*nr; altfel se introduce 2*nr. Afișati numarul
de saloane modificat.

DECLARE
v_nr sectii.numar_saloane%type;
BEGIN
SELECT numar_saloane
INTO v_nr
FROM sectii
WHERE id_sectie=&a;
DBMS_OUTPUT.PUT_LINE('Numarul de saloane initial este '||v_nr);
v_nr:=CASE WHEN v_nr < 5 THEN 4*v_nr
WHEN v_nr BETWEEN 5 AND 10 THEN 3*v_nr
ELSE 2*v_nr
END;
DBMS_OUTPUT.PUT_LINE('Numarul de saloane final este '||v_nr);
END;
3. Să se afișeze angajatii cu id-ul cuprins între 010 și 015, atât timp cât salariul lor e
mai mare decât media.

DECLARE
v_salariu angajatii.salariu_angajat%type;
v_salariuMediu angajatii.salariu_angajat%type;
i NUMBER :=010;
BEGIN
SELECT AVG(salariu_angajat) INTO v_salariuMediu FROM angajatii;
DBMS_OUTPUT.PUT_LINE('Salariul mediu este: '||v_salariuMediu);
LOOP
SELECT salariu_angajat INTO v_salariu FROM angajatii WHERE id_angajat=i;
DBMS_OUTPUT.PUT_LINE('Angajatul cu id-ul '||i||' are salariul '||v_salariu);
i:=i+1;
EXIT WHEN v_salariu<v_salariuMediu OR i>015;
END LOOP;
END;
4. Se citește de la tastatură id-ul unui angajat. Dacă acesta este mai mic sau egal cu
015, să se afișeze numele și salariul angajatului. Altfel, să se afișeze prenumele și
data angajarii ai acestuia.

DECLARE
v_nume VARCHAR(20);
v_prenume VARCHAR(40);
v_data_angajarii DATE;
v_salariu_angajat NUMBER ;
v_id_angajat NUMBER NOT NULL:=&id;
BEGIN
IF v_id_angajat <= 015 THEN
SELECT nume_angajat, salariu_angajat, id_angajat
INTO v_nume, v_salariu_angajat, v_id_angajat
FROM angajatii
WHERE id_angajat=v_id_angajat;
DBMS_OUTPUT.PUT_LINE('Angajatul'||v_nume||' ' ||'are salariul de '||v_salariu_angajat);
ELSE
SELECT prenume_angajat, data_angajarii
INTO v_prenume, v_data_angajarii
FROM angajatii
WHERE id_angajat=v_id_angajat;
DBMS_OUTPUT.PUT_LINE('Angajatul '||v_prenume||' s-a angajat pe data de
'||v_data_angajarii);
END IF;
END;
5. Utilizarea cursorilor și a excepțiilor în cadrul blocurilor PL/SQL

1. Să se afișeze numele, prenumele și salariul primilor 5 angajatii cu cel mai mare


salariu.
DECLARE
CURSOR c1 IS SELECT nume_angajat, prenume_angajat, salariu_angajat FROM angajatii
ORDER BY
salariu_angajat DESC;
v1_nume angajatii.nume_angajat%type;
v1_prenume angajatii.prenume_angajat%type;
v1_salariu angajatii.salariu_angajat%type;
BEGIN
OPEN c1;
LOOP
FETCH c1 INTO v1_nume, v1_prenume,v1_salariu;
EXIT WHEN c1%ROWCOUNT>5;
DBMS_OUTPUT.PUT_LINE(v1_nume||' ' ||v1_prenume||' '||v1_salariu);
END LOOP;
CLOSE c1;
END;
2. Să se afișeze numele si id-ul tuturor pacienților
DECLARE
CURSOR c2 IS SELECT nume_pacient, id_pacient FROM pacienti;
v2_nume pacienti.nume_pacient%type;
v2_id pacienti.id_pacient%type;
BEGIN
OPEN c2;
LOOP
FETCH c2 INTO v2_nume, v2_id;
EXIT WHEN c2%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(v2_nume||' ' ||v2_id);
END LOOP;
CLOSE c2;
END;
3. Sa se afiseze numele pacientilor, a cafror data de externare este in ziua de 20.
DECLARE
CURSOR c3 IS SELECT w.nume_pacient, x.data_externarii FROM pacienti w, fisa_pacient x
WHERE w.id_pacient=x.id_pacient AND extract (day from x.data_externarii)=20;
BEGIN
FOR v1_pacient IN c3 LOOP
DBMS_OUTPUT.PUT_LINE(v1_pacient.nume_pacient||' '||v1_pacient.data_externarii);
END LOOP;
END;
4. Să se modifice (adăugând 1000) salariul angajatilor care au salariul mai mare dec at
o valoare cititia de la tastatura.

DECLARE
nu_exista EXCEPTION;
val NUMBER := &valoare;
BEGIN
UPDATE angajatii SET salariu_angajat=salariu_angajat+1000 WHERE salariu_angajat>val;
IF SQL%FOUND THEN
DBMS_OUTPUT.PUT_LINE('s-au modificat '||SQL%ROWCOUNT ||' salarii');
ELSE
RAISE nu_exista;
END IF;
EXCEPTION WHEN nu_exista THEN
DBMS_OUTPUT.PUT_LINE('Nu exista angajati cu salariul mai mare de 3000 de lei.');
END;
ROLLBACK;
Pentru valoarea 5000
Pentru valoarea de 3000
6. Funcții, proceduri (minim 3 funcții, 3 proceduri)

1. Creati o procedura care sa afiseze salariul tuturor angajatilor. Apelati procedura,

CREATE OR REPLACE PROCEDURE salariu_angajati


AS
CURSOR c1 IS SELECT nume_angajat, salariu_angajat FROM angajatii;
BEGIN
FOR i IN c1 LOOP
DBMS_OUTPUT.PUT_LINE('Angajatul '||i.nume_angajat||' are salariul '||i.salariu_angajat);
END LOOP;
END;
EXECUTE salariu_angajati
2. Creati o functie care sa afiseze salariul unui angajat pentru un id introdus ca
parametru de intrare.
CREATE OR REPLACE FUNCTION calcul_salariu (f_id IN NUMBER)
RETURN NUMBER
AS
v_salariu angajatii.salariu_angajat%TYPE;
BEGIN
SELECT salariu_angajat INTO v_salariu
FROM angajatii
WHERE id_angajat=f_id;
RETURN v_salariu;
EXCEPTION
WHEN NO_DATA_FOUND THEN RETURN -1;
END;

DECL
ARE v
NUMB
ER;
BEGIN
v:=calcul_salariu(010);
IF v != -1 THEN
DBMS_OUTPUT.PUT_LINE('Salariul are valoarea '||v);
ELSE
DBMS_OUTPUT.PUT_LINE('Salariul nu exista.');
END IF;
END;
3. Apelati functia calcul_salariu in cadrul unei proceduri, afisare_salariu_angajat,
prin care se vor parcurge toti angajatii.
CREATE OR REPLACE PROCEDURE afisare_salariu_angajat
AS
CURSOR c2 IS SELECT * FROM angajatii;
v_salariu angajatii.salariu_angajat%TYPE;
BEGIN
FOR i IN c2 LOOP
v_salariu:=calcul_salariu(i.id_angajat);
DBMS_OUTPUT.PUT_LINE('Angajatul '||i.id_angajat||' are salariul '||v_salariu);
END LOOP;
END;
EXECUTE afisare_salariu_angajat

4. Creati functia nuamr_sectii care sa calculeze numar de sectii cu un numar de


saloane mai mare decat x, x fiind un parametru de intrare.
CREATE OR REPLACE FUNCTION numar_sectii(x NUMBER)
RETURN
NUMBER AS
v_numar
NUMBER;
cursor c3 is select * from sectii;
BEGIN
v_numar:=0;
FOR var1 IN c3 LOOP
IF var1.numar_saloane>x
THEN
v_numar:=v_numar+1;
END IF;
END LOOP;
RETURN v_numar;
END;
--Apelare
DECL
ARE v
NUMB
ER;
BEGIN
v:=numar_sectii(2);
DBMS_OUTPUT.PUT_LINE('Sunt '||v||' sectii cu un numar de saloane mai mare de 2.');
END;
5. Creati procedura marire_saloane prin care se mareste numarul de saloane printr-
o valoare. Valoarea si id-ul sectiei vor fi primite ca parametrii.
CREATE OR REPLACE PROCEDURE marire_saloane(p_val NUMBER, p_id
NUMBER) AS
v_saloane NUMBER;
BEGIN
SELECT numar_saloane INTO v_saloane FROM sectii WHERE p_id=id_sectie;
DBMS_OUTPUT.PUT_LINE('Sectia '|| p_id||' are '||v_saloane|| ' salone');
UPDATE sectii SET numar_saloane=numar_saloane+p_val
WHERE id_sectie=p_id;
SELECT numar_saloane INTO v_saloane FROM sectii WHERE p_id=id_sectie;
DBMS_OUTPUT.PUT_LINE('Sectia '|| p_id||' are '||v_saloane|| ' salone');
END;
EXECUTE marire_saloane(1,1200)

6. Creati functia testare_saloane care primeste ca parametru de intrare id-ul unei


sectii si returneaza 0 daca numarul saloanelor este mai mic decat media si 1 in
caz contrar.
CREATE OR REPLACE FUNCTION testare_saloane(f_id NUMBER)
RETURN
NUMBER AS
media
NUMBER;
v_saloane
NUMBER;
BEGIN
SELECT AVG(numar_saloane)INTO media FROM sectii;
SELECT numar_saloane INTO v_saloane FROM sectii WHERE f_id=id_sectie;
IF v_saloane < media THEN
RETURN 0;
ELSE
RETURN 1;
END IF;
END;
--Apelare
DECLARE
test_v NUMBER;
BEGIN
test_v:=testare_saloane(1201);
DBMS_OUTPUT.PUT_LINE(test_v);
IF test_v!=1 THEN
DBMS_OUTPUT.PUT_LINE('Sectia are un numar de saloane mai mic decat media.');
ELSE
DBMS_OUTPUT.PUT_LINE('Sectia are un numar de saloane mai mare sau egal cu
media.');
END IF;
END;
7. Folosind baza de date proprie, sa se construiasca o procedura, cu un parametru de
intrare, care va afisa informatii din cel putin 3 tabele, printr-un cursor. Sa se trateze
printr-o exceptiecazul in care cursorul nu aduce nicio inregistrare. Sa se apeleze
procedura.

CREATE OR REPLACE PROCEDURE Afisare_pacient(p_id IN NUMBER)


AS
CURSOR c IS SELECT p.nume_pacient||' '||p.prenume_pacient nume_pacient, m.id_sectie,
n.nume_sectie
FROM pacienti p, fisa_pacient m, sectii n
WHERE m.id_sectie=n.id_sectie AND p.id_pacient=m.id_pacient;
id_invalid EXCEPTION;
i c%ROWTYPE;
BEGIN
OPEN c;
LOOP FETCH c INTO i;
IF c%NOTFOUND THEN
RAISE id_invalid;
ELSE
DBMS_OUTPUT.PUT_LINE('Pacientul cu numele '|| i.nume_pacient||' se afla in sectia
'||i.id_sectie||', ' ||i.nume_sectie);
END IF;
END LOOP;
CLOSE c;
EXCEPTION WHEN id_invalid THEN
DBMS_OUTPUT.PUT_LINE('id-ul introdus este invalid');
END;
EXECUTE Afisare_pacient(511)
EXECUTE Afisare_pacient(1)
8. Folosind baza de date de la proiectul propriu, sa se construiasca o procedura prin care,
prin intermediul unui parametru de intrare, sa se actualizeze in sens de stergere
inregistrarile uneia dintre tabele. Sa se contorizeze numarul de linii sterse.

CREATE OR REPLACE PROCEDURE stergere_informatii(v_an IN NUMBER)


AS
nu_exista_modificari EXCEPTION;
BEGIN
DELETE FROM fisa_pacient WHERE EXTRACT(YEAR FROM data_externarii)=v_an;
IF SQL%ROWCOUNT=0 THEN
RAISE nu_exista_modificari;
ELSE
DBMS_OUTPUT.PUT_LINE('S-au efectuat '||SQL%ROWCOUNT||' modificari');
END IF;
EXCEPTION WHEN nu_exista_modificari THEN
DBMS_OUTPUT.PUT_LINE('Nu s-a efectuat nicio modificare');
END;
EXECUTE stergere_informatii(2021)
ROLLBACK;
EXECUTE stergere_informatii(1)
9. Folosind baza de date de la proiectul propriu, sa se construiasca o procedura cu 2
parametri care sa efectueze o actualizare in sens de modificare. Sa se contorizeze numarul
de linii modificate. Sa se trateze o exceptie. Sa se apeleze procedura intr-un bloc anonim.
CREATE OR REPLACE PROCEDURE actualizare_informatii(v_an IN NUMBER, v_valoare
IN NUMBER)
AS
an_invalid EXCEPTION;
BEGIN
UPDATE angajatii SET salariu_angajat=salariu_angajat+v_valoare
WHERE EXTRACT(YEAR from data_angajarii)=v_an;
IF SQL%ROWCOUNT=0 THEN
RAISE an_invalid;
ELSE
DBMS_OUTPUT.PUT_LINE('S-au efectuat '||SQL%ROWCOUNT||' modificari');
END IF;
EXCEPTION WHEN an_invalid THEN
DBMS_OUTPUT.PUT_LINE('Nu exista niciun angajat angajat in anul respectiv.');
END;
EXECUTE actualizare_informatii(2021,100)
ROLLBACK;
EXECUTE actualizare_informatii(1000,2)
10. Folosind baza de date de la proiectul propriu, sa se construiasca un bloc anonim care,
folosind o subcerere, sa actualizeze în sens de tergere înregistrarile uneia dintre tabele. Sa
se contorizeze numarul de linii sterse. Si se trateze o exceptie.

DECLARE
v_an NUMBER := &a;
an_invalid EXCEPTION;
BEGIN
DELETE FROM fisa_pacient WHERE EXTRACT(YEAR FROM data_externarii)=v_an;
IF SQL%ROWCOUNT=0 THEN
RAISE an_invalid;
ELSE
DBMS_OUTPUT.PUT_LINE('S-au efectuat '||SQL%ROWCOUNT||' modificari');
END IF;
EXCEPTION WHEN an_invalid THEN
DBMS_OUTPUT.PUT_LINE('Anul introdus este invalid');
END;
ROLLBACK;
11. Folosind baza de date de la proiectul propriu, sa se construiasca un bloc anonim care,
folosind un cursor, sa afiseze informatii din 2 tabele. Sa se trateze o exceptie si sa se
foloseasca o functie de grup.

DECLARE
CURSOR c IS SELECT m.id_sectie, r.numar_saloane sectiisisaloane FROM fisa_pacient m,
sectii r
WHERE r.id_sectie=m.id_sectie;
BEGIN
FOR i IN c LOOP
DBMS_OUTPUT.PUT_LINE(i.id_sectie||' '||i.sectiisisaloane);
END LOOP;
EXCEPTION WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('Nu au fost gasite date');
END;

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