Documente Academic
Documente Profesional
Documente Cultură
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.
• angajatii
• alocari_angajati
• fisa_pacient
• sectii
• pacienti
2. Schema bazei de date
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
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)
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
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;