Documente Academic
Documente Profesional
Documente Cultură
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
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
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
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
Data Type
Nullable
COD_GRUPA
NUMBER(5,0)
No
NUME_GRUPA
VARCHAR2(4)
No
Default
Primary
Key
1
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
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
Primary
Key
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
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;
/
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;
/
ADASCALITEI IOAN
GRUPA 1026
END;
/
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
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
ADASCALITEI IOAN
GRUPA 1026
dbms_output.put_line(v_nume);
end loop;
end;
/
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
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
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;
/
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
ADASCALITEI IOAN
GRUPA 1026
end loop;
end;
/
ADASCALITEI IOAN
GRUPA 1026
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;
/
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
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
ADASCALITEI IOAN
GRUPA 1026
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;
/
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
ADASCALITEI IOAN
GRUPA 1026
H.Aplicatia APEX
1.Paginile aplicatiei
2.Validare cod_persoana
ADASCALITEI IOAN
GRUPA 1026