proiect sgbd

46
Gestiunea caminelor studentesti

Upload: simi-sim

Post on 26-Sep-2015

27 views

Category:

Documents


4 download

DESCRIPTION

Proiect SGBD, Gestiunea caminelor studentesti

TRANSCRIPT

Gestiunea caminelor studentesti

Scarlat Simona Ileana, grupa 1034,

seria B, Informatica economica

A. Descrierea problemei i prezentarea schemei conceptuale

Tema proiectului este reprezentata de gestiunea unei baze de date care contine evidenta caminelor studentesti oferite de toate facultatile din cadrul unei universitati.

Tabela Universitate contine informatii referitoare la nume, adresa si telefon.

Tabela Facultate contine informatii despre numele fiecarei facultati, orasul, numarul de studenti si locurile in camin pe care le ofera. O facultate nu poate apartine mai multor universitati.

Tabela Student contine informatii despre numele si prenumele studentului, anul de studiu, localitatea, sexul si media. Fiecare student apartine unei singure facultati.

Tabela Camine contine informatii despre numele caminului si se specifica daca acel camin are baie in camera. O facultate ofera mai multe camine.

Tabela Administrator contine informatii despre numele si prenumele administratorilor caminelor oferite de universitate, precum si, salariul si numarul de telefon al fiecaruia.

Tabela Repartizari contine informatii despre numele caminului si numarul de locuri pe care il ofera fiecare facultate a unei universitati.

Tabela Camera contine informatii despre studentii care au primit camera in camin, ce fel de camera este si cate locuri au mai ramas libere in camera respectiva.

Schema tabelei

UNIVERSITATE

Cod_universitate

Nume

Adresa

Telefon

FACULTATE

Cod_facultate

Cod_universitate

Nume

Oras

Numar_studenti

Locuri_camin

STUDENT

Cod_student

Cod_universitate

Cod_facultate

Nume

Prenume

An_studiu

Localitate

Sex

Media

REPARTIZARI

Cod_repartizare

Cod_universitate

Cod_facultate

Cod_camin

Nume_camin

Numar_locuri

CAMINE

Cod_camin

Nume

Baie_in_camera

ADMINISTRATOR

Cod_administrator

Cod_camin

Nume

Prenume

Telefon

Salariu

CAMERA

Cod_camera

Cod_camin

Cod_student

Tip_camera

Locuri_libere

Schema conceptuala a bazei de date

B.Interaciunea cu serverul Oracle prin intermediul comenzilor SQL

Blocuri anonime

1. Sa se afiseze facultatea studentului cu codul 5009, precum si camera in care a fost repartizat folosind un bloc anonim, iar daca nu exista studentul cu acest cod sa se trateze ca si exceptie.

set serveroutput on

DECLARE

v_nume_facultate facultate.Nume%TYPE;

v_cod_student student.Cod_student%TYPE;

v_camera camera.cod_camera%TYPE;

BEGIN

SELECT f.nume,s.cod_student INTO v_nume_facultate,v_cod_student FROM Facultate f,Student s

where s.cod_student=5009 and f.cod_facultate=s.cod_facultate;

SELECT Cod_camera INTO v_camera FROM Camera WHERE Cod_student=5009;

DBMS_OUTPUT.PUT_LINE('Studentul al carui cod este '||v_cod_student|| ' invata in facultatea '||v_nume_facultate||' si a fost

repartizat in camera cu codul '||v_camera|| '.');

EXCEPTION WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Nu exista studentul cu codul 50009');

END;

/

//Facultatea CSIE ofera in caminul Belvedere A6 56 locuri pentru studenti.

2. Sa se afiseze numele administratorului caminului Moxa, precum si adresa acestuia stocat intr-o variabila de mediu. Adresa este 'Str. Mihail Moxa nr. 11'.

set serveroutput on

VARIABLE g_adresa varchar2(50)

DECLARE

v_nume_adm Administrator.Nume%TYPE;

v_prenume_adm Administrator.Prenume%TYPE;

BEGIN

SELECT Nume,Prenume INTO v_nume_adm,v_prenume_adm FROM Administrator WHERE Cod_camin=(SELECT Cod_camin FROM Camine WHERE Nume='Moxa D');

:g_adresa:='Str. Mihail Moxa nr. 11';

DBMS_OUTPUT.PUT_LINE('Administratorul din caminul Moxa D se numeste: '||v_nume_adm||' '||v_prenume_adm);

DBMS_OUTPUT.PUT_LINE('Adresa caminului este: ');

END;

/

PRINT g_adresa

//Administratorul din caminul Moxa D se numeste: Stanciu Ionut

Adresa caminului este:

G_ADRESA

-----------------------

Str. Mihail Moxa nr. 11

3. Sa se afiseze Facilitatile caminului Belvedere A6 intr-o variabila de mediu, facilitatile sunt 'Sal de lectur i oficiu (buctrie) la fiecare etaj', numele administratorului si salariul acestuia si sa se introduca de la tastatura, adresa acestui camin si sa se afiseze pe ecran.

Str. Chibzuinei nr. 2

set serveroutput on

VARIABLE g_facilitati varchar

ACCEPT adresa PROMPT 'Introduceti adresa caminului Belvedere A6'

DECLARE

v_nume_adm Administrator.Nume%TYPE;

v_prenume_adm Administrator.Prenume%TYPE;

v_salariu Administrator.Salariu%TYPE;

adresa varchar2(50);

BEGIN

SELECT Nume,Prenume,Salariu INTO v_nume_adm,v_prenume_adm,v_salariu FROM Administrator WHERE

Cod_camin=(SELECT Cod_camin FROM Camine WHERE Nume='Belvedere A6');

DBMS_OUTPUT.PUT_LINE('Numele administratorului din Belvedere A6 este: '||v_nume_adm||' '||v_prenume_adm|| ' si are

un salariu de '||v_salariu);

adresa:='&adresa';

DBMS_OUTPUT.PUT_LINE('Adresa caminului Belvedere A6 este: '||adresa);

:g_facilitati:='Sala de lectur si oficiu (buctrie) la fiecare etaj';

DBMS_OUTPUT.PUT_LINE('Caminul are urmatoarele facilitati: ');

END;

/

PRINT g_facilitati

Numele administratorului din Belvedere A6 este: Popovici Cristian Ionel si are

un salariu de 2500

Adresa caminului Belvedere A6 este: str Chibzuintei nr2

Caminul are urmatoarele facilitati:

G_FACILITATI

-----------------------------------------------------

Sala de lectura si oficiu (bucatarie) la fiecare etaj

4. Sa se afiseze numele studentului al carei cod al facultatii e introdus de la tastatura, si nr de locuri ocupate din camera de camin in care a fost repartizat.

set serveroutput on

ACCEPT Cod_stud PROMPT 'Introduceti codul studentului'

DECLARE

v_nume Student.Nume%TYPE;

v_prenume Student.Prenume%TYPE;

v_locuri_ocupate number(1);

Cod_stud Student.Cod_student%TYPE;

BEGIN

SELECT Nume,Prenume INTO v_nume,v_prenume FROM Student WHERE Cod_student=&Cod_stud;

DBMS_OUTPUT.PUT_LINE('Numele studentului care are codul ' ||&Cod_stud|| ' se numeste' ||v_nume|| ' '||v_prenume);

SELECT Tip_camera-Locuri_libere INTO v_locuri_ocupate FROM Camera WHERE Cod_student=&Cod_stud;

DBMS_OUTPUT.PUT_LINE('Camera in care sta studentul cu codul '||&Cod_stud|| ' are '||v_locuri_ocupate|| ' locuri ocupate');

end;

/

Numele studentului care are codul 5009 se numeste MOLOFEI CONSTANTIN

Camera in care sta studentul cu codul 5009 are 3 locuri ocupate

5. Sa se mareasca salariul administratorului caminului Tei C1 cu un procent dat de la tastatura.

set serveroutput on

VARIABLE g_salariu_marit number

ACCEPT p_procent PROMPT 'Introduceti procentul'

DECLARE

p_procent number(3,2);

v_salariu Administrator.Salariu%TYPE;

BEGIN

SELECT salariu INTO v_salariu FROM Administrator WHERE Cod_camin=(SELECT Cod_camin from Camine WHERE nume='Tei C1');

DBMS_OUTPUT.PUT_LINE('Salariul administratorului caminului Tei C1 este ' ||v_salariu);

p_procent:=&p_procent;

DBMS_OUTPUT.PUT_LINE('Salariul administratorului caminului Tei C1 s-a marit cu procentul '||p_procent*100|| '%');

:g_salariu_marit:=v_salariu+v_salariu*p_procent;

DBMS_OUTPUT.PUT_LINE('Noul salariu al administratorului caminului Tei C1 este: ');

END;

/

PRINT g_salariu_marit

Salariul administratorului caminului Tei C1 este 2800

Salariul administratorului caminului Tei C1 s-a marit cu procentul 20%

Noul salariu al administratorului caminului Tei C1 este:

G_SALARIU_MARIT

----

3360

6. Sa se creeze tabela Adrese pt facultati si sa se insereze adresa 'Bulevardul Dacia'in cazul in care codul maxim al facultatilor este 110, afisandu-se numele facultatii cu codul maxim.

set serveroutput on

BEGIN

EXECUTE IMMEDIATE 'CREATE TABLE Adrese(Cod_facultate number(3), CONSTRAINT FK_Cod_facultate_A FOREIGN KEY(Cod_facultate)

REFERENCES Facultate(Cod_facultate), Adresa varchar2(70))';

END;

/

set serveroutput on

DECLARE

v_cod Facultate.Cod_facultate%TYPE;

v_nume Facultate.Nume%TYPE;

v_adresa varchar2(50);

BEGIN

select max(Cod_facultate) INTO v_cod FROM Facultate;

select Nume INTO v_nume FROM Facultate WHERE Cod_facultate=v_cod;

DBMS_OUTPUT.PUT_LINE(v_cod||v_nume);

IF v_cod=110 THEN

v_adresa:='Bulevardul Dacia,nr 41';

DBMS_OUTPUT.PUT_LINE('Adresa facultatii ' ||v_nume||' este '||v_adresa);

INSERT INTO Adrese VALUES(v_cod,v_adresa);

ELSE

DBMS_OUTPUT.PUT_LINE('Informatiile nu corespund');

END IF;

END;

/

110 Relatii economice internationale

Adresa facultatii Relatii economice internationale este Bulevardul Dacia,nr 41

7 . Stergeti tabela Adrese si creati din nou tabela Adresa_facultate care sa contina coloana Cod_facultate din tabela Facultate si sa se adauge ulterior coloana Adresa si sa se insereze in coloana Adresa valoarea Calea Serban Voda, nr22-24 pt codul 101.

set serveroutput on

BEGIN

EXECUTE IMMEDIATE 'DROP TABLE Adrese';

EXECUTE IMMEDIATE 'CREATE TABLE Adresa_facultate AS SELECT Cod_facultate FROM Facultate';

EXECUTE IMMEDIATE 'ALTER TABLE Adresa_facultate ADD Adresa varchar2(50)';

END;

/

select * from Adresa_facultate;

set serveroutput on

BEGIN

UPDATE Adresa_facultate SET Adresa='Calea Serban Voda 22-24'

WHERE Cod_facultate=101;

END;

/

8. Sa se modifice salariul administratorilor astfel, pt caminul Belvedere A1 cu un procent dat de la tastatura,Belvedere A6 cu un procent mai mare cu 10% fata de primul introdus de la tastatura, iar pt P6 cu 30%.

set serveroutput on

ACCEPT p_proc_A1 PROMPT 'Procent pentru Belvedere A1'

DECLARE

p_proc_A1 number(3,2);

v_salariu_A1 Administrator.Salariu%TYPE;

v_salariu_A6 Administrator.Salariu%TYPE;

v_salariu_P6 Administrator.Salariu%TYPE;

p_proc_A6 number(3,2);

BEGIN

SELECT Salariu INTO v_salariu_A1 FROM Administrator WHERE Cod_camin=(SELECT Cod_camin FROM Camine WHERE nume='Belvedere A1');

DBMS_OUTPUT.PUT_LINE('Administratorul caminului Belvedere A1 avea un salariu de '||v_salariu_A1);

p_proc_A1:=&p_proc_A1;

v_salariu_A1:=v_salariu_A1+v_salariu_A1*p_proc_A1;

DBMS_OUTPUT.PUT_LINE('Salariul administratorului caminului Belvedere A1 s-a modificat cu procentul '||p_proc_A1*100||'%.'||' Salariul marit este '

||v_salariu_A1);

SELECT Salariu INTO v_salariu_A6 FROM Administrator WHERE Cod_camin=(SELECT Cod_camin FROM Camine WHERE nume='Belvedere A6');

DBMS_OUTPUT.PUT_line('Administratorul caminului Belvedere A6 avea un salariu de '||v_salariu_A6);

p_proc_A6:=p_proc_A1+0.1;

v_salariu_A6:=v_salariu_A6+v_salariu_A6*p_proc_A6;

DBMS_OUTPUT.PUT_LINE('Salariul administratorului caminului Belvedere A6 s-a modificat cu procentul '||p_proc_A6*100|| ' Salariul marit

este: '||v_salariu_A6);

SELECT Salariu INTO v_salariu_P6 FROM Administrator WHERE Cod_camin=(SELECT Cod_camin FROM Camine WHERE nume='P6');

v_salariu_P6:=v_salariu_P6+v_salariu_P6*0.3;

DBMS_OUTPUT.PUT_LINE(v_salariu_P6);

EXCEPTION WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('Caminul P6 nu e inregistrat in baza de date');

END;

/

Administratorul caminului Belvedere A1 avea un salariu de 2000

Salariul administratorului caminului Belvedere A1 s-a modificat cu procentul 20%. Salariul marit este 2400

Administratorul caminului Belvedere A6 avea un salariu de 2500

Salariul administratorului caminului Belvedere A6 s-a modificat cu procentul 30 Salariul marit

este: 3250

Caminul P6 nu e inregistrat in baza de date

Variabile RECORD

9. Folosind un tip de data record de acelasi tip cu tabela camine, sa se afiseze numele caminului cu codul 2000.

set serveroutput on

DECLARE

v_Camine Camine%ROWTYPE;

BEGIN

SELECT * INTO v_Camine from Camine WHERE cod_camin=2000;

DBMS_OUTPUT.PUT_LINE('Caminul cu codul '||v_Camine.Cod_camin||' se numeste '||v_camine.Nume||'. Baie in camera: '||v_camine.Baie_in_camera);

end;

/

Caminul cu codul 2000 se numeste Belvedere A1. Baie in camera: NU

10. Sa se afiseze camerele ale caror coduri sunt cuprinse intre 700 si 800, folosind o variabila de tip RECORD si care mai mult de un loc liber.

set serveroutput on

DECLARE

vrec_camera camera%ROWTYPE;

BEGIN

FOR i IN 700..800 LOOP

SELECT * INTO vrec_camera FROM Camera WHERE cod_camera=i;

IF vrec_camera.locuri_libere>=2 THEN

DBMS_OUTPUT.PUT_LINE('Camera cu codul '||vrec_camera.cod_camera|| ' este o camera de '||vrec_camera.tip_camera||' persoane si mai are '||vrec_camera.locuri_libere||' locuri libere');

END IF;

END LOOP;

END;

/

Camera cu codul 701 este o camera de 3 persoane si mai are 2 locuri libere

Camera cu codul 703 este o camera de 3 persoane si mai are 2 locuri libere

Camera cu codul 705 este o camera de 4 persoane si mai are 3 locuri libere

C. Structuri alternativa si repetitive

1. Sa se verifice daca codul facultatii cibernetica respectiv marketing este 109, respectiv 108, iar daca este adevarat, sa se afiseze procentul studentilor care ocupa locuri in camine.

set serveroutput on

DECLARE

v_cod_C Facultate.Cod_facultate%TYPE;

v_cod_M Facultate.Cod_facultate%TYPE;

v_proc1 number(4,2);

v_proc2 number(4,2);

BEGIN

SELECT Cod_facultate,Locuri_camin/Numar_studenti INTO v_cod_C,v_proc1 FROM Facultate

WHERE nume LIKE '_Cibernetica%';

SELECT Cod_facultate,Locuri_camin/Numar_studenti INTO v_cod_M,v_proc2 FROM Facultate WHERE nume LIKE 'Mark%';

IF v_cod_C=109 THEN

v_proc1:=v_proc1*100;

DBMS_OUTPUT.PUT_LINE('Procentul studentilor din facultatea Cibernetica care ocupa locuri in camine este de '||v_proc1||'%');

ELSE

DBMS_OUTPUT.PUT_LINE('Codul pt Cibernetica nu corespunde');

END IF;

IF v_cod_M=108 THEN

v_proc2:=v_proc2*100;

DBMS_OUTPUT.PUT_LINE('Procentul studentilor din facultatea Marketing care ocupa locuri in camine este de '||v_proc2||'%');

ELSE

DBMS_OUTPUT.PUT_LINE('Codul pt Marketing nu corespunde');

END IF;

END;

/

Procentul studentilor din facultatea Cibernetica care ocupa locuri in camine este de 17%

Procentul studentilor din facultatea Marketing care ocupa locuri in camine este de 12%

2. Daca nr de locuri oferite de facultatea Cibernetica este mai mic decat media tuturor locurilor oferite de ASE in camine atunci sa se adauge inca 10%, iar daca este mai mare decat media, atunci sa se adauge 5%.

set serveroutput on

DECLARE

v_locuri_camin Facultate.Locuri_camin%TYPE;

v_medie number(5,2);

v_locuri_actualizat number(4);

BEGIN

SELECT avg(Locuri_camin) INTO v_medie FROM Facultate WHERE nume LIKE '_Cib%';

SELECT Locuri_camin INTO v_locuri_camin FROM Facultate WHERE nume LIKE '_Cib%';

IF v_locuri_camin3000 THEN 100

END;

SELECT Locuri_camin INTO v_locuri_camin FROM Facultate WHERE Cod_facultate=v_cod;

v_locuri_camin:=v_locuri_camin+v_locuri;

DBMS_OUTPUT.PUT_LINE('Locurile au fost suplimentate cu '||v_locuri||'. Facultatea cu codul '||v_cod|| ' va avea '||v_locuri_camin||'

locuri pentru studenti in caminele ASE');

END;

/

Locurile au fost suplimentate cu 100. Facultatea cu codul 103 va avea 591

locuri pentru studenti in caminele ASE

4. Sa se afiseze facultatile care au codurile cuprinse intre 105-110 atata timp cat numar_studenti media se iese din bucla.

set serveroutput on

DECLARE

v_medie number(5,1);

v_nume Facultate.Nume%TYPE;

i number(3):=104;

v_nr_stud Facultate.Numar_studenti%TYPE;

BEGIN

SELECT AVG(Numar_studenti) INTO v_medie FROM Facultate;

loop

select Nume into v_nume from Facultate where cod_facultate=i;

select numar_studenti into v_nr_stud FROM Facultate WHERE Cod_facultate=i;

exit when i>110 or v_nr_stud>v_medie;

dbms_output.put_line('Facultatea cu codul '||i|| ' se numeste '||v_nume);

i:=i+1;

end loop;

END;

/

Facultatea cu codul 104 se numeste Economie Agroalimentara si a Mediului

Facultatea cu codul 105 se numeste Economie Teoretica si Aplicata

5. Sa se afiseze numele primilor studenti cu codurile cuprinse 5000 si studentul cu codul 5023, care au media >8.

while conditie... loop ...end loop.

set serveroutput on

DECLARE

i number(4):=5000;

v_nume Student.Nume%TYPE;

v_medie Student.Media%TYPE;

BEGIN

WHILE ip_medie order by cod_facultate ASC;

--declaram o variabila care sa retina valoarea pe care o dam ca parametru

v_medie number(1);

--ne folosim de o variabila record in care sa punem informatiile retinute de cursor

v_rec c1%ROWTYPE;

BEGIN

--initializam variabila care retine valoarea parametrului

v_medie:=7;

DBMS_OUTPUT.PUT_LINE('Urmatoarele facultati au media pe facultate mai mare decat '||v_medie);

open c1(v_medie);

LOOP

FETCH c1 INTO v_rec;

EXIT WHEN c1%NOTFOUND;

DBMS_OUTPUT.PUT_LINE('Facultatea care are codul '||v_rec.Cod||' are media pe facultate de '||v_rec.Medie);

END LOOP;

close c1;

END;

/

Urmatoarele facultati au media pe facultate mai mare decat 7

Facultatea care are codul 102 are media pe facultate de 9,285

Facultatea care are codul 103 are media pe facultate de 8,21

Facultatea care are codul 106 are media pe facultate de 9,77

Facultatea care are codul 107 are media pe facultate de 9,03

Facultatea care are codul 108 are media pe facultate de 8,2

Facultatea care are codul 109 are media pe facultate de 8,90

Facultatea care are codul 110 are media pe facultate de 9,43

10. Sa se adauge in tabela Adresa_facultate o coloana numita Sector si sa se completeze cu valoarea 2 daca facultatea are codul mai mic de 105 si cu 3 in rest, dupa care sa se afiseze sectorul pt fiecare cod.

set serveroutput on

BEGIN

EXECUTE IMMEDIATE 'ALTER TABLE Adresa_facultate ADD (Sector number(1))';

END;

/

set serveroutput on

DECLARE

CURSOR c1 is select cod_facultate,adresa,Sector FROM Adresa_facultate

FOR UPDATE OF Sector NOWAIT;

BEGIN

--il folosim pe FOR ca sa se creeze automat o variabila de tip record in care sa punem informatiile retinute de cursor

FOR vrec_c1 IN c1 LOOP

UPDATE Adresa_facultate SET Sector=2 WHERE Cod_facultate104;

end loop;

for vrec_c1 in c1 loop

DBMS_OUTPUT.PUT_LINE('Facultatea cu codul '||vrec_c1.cod_facultate|| ' se afla in sectorul '||vrec_c1.sector);

END LOOP;

end;

/

Facultatea cu codul 101 se afla in sectorul 2

Facultatea cu codul 102 se afla in sectorul 2

Facultatea cu codul 103 se afla in sectorul 2

Facultatea cu codul 104 se afla in sectorul 2

Facultatea cu codul 105 se afla in sectorul 3

Facultatea cu codul 106 se afla in sectorul 3

Facultatea cu codul 107 se afla in sectorul 3

Facultatea cu codul 108 se afla in sectorul 3

Facultatea cu codul 109 se afla in sectorul 3

Facultatea cu codul 110 se afla in sectorul 3

F. Funcii, proceduri,pachete

Proceduri

Parametri IN

1. Sa se creeze procedura modifica_salariu care sa majoreze salariilor administratorilor si primeste ca si parametri codul si procentul.

--valoarea variabilei actuale e transferata in variabila definita de procedura

--parametrul IN apare mereu in partea dreapta

--parametrul nu se modifica, e implicit

set serveroutput on

CREATE OR REPLACE PROCEDURE modifica_salariul(p_cod IN Administrator.Cod_administrator%TYPE , p_proc IN number) IS

v_salariu Administrator.Salariu%TYPE;

BEGIN

SELECT salariu INTO v_salariu FROM Administrator WHERE cod_administrator=p_cod;

DBMS_OUTPUT.PUT_LINE('Administratorul avea un salariu de '||v_salariu);

UPDATE Administrator SET Salariu=salariu*(1+p_proc/100) WHERE cod_administrator=p_cod;

SELECT salariu into v_salariu FROM Administrator WHERE cod_administrator=p_cod;

DBMS_OUTPUT.PUT_LINE('Administratorul are acum un salaru de '||v_salariu);

END;

/

EXECUTE modifica_salariul(402, 50)

Administratorul avea un salariu de 2000

Administratorul are acum un salaru de 3000

2. Sa se creeze o procedura care primeste ca parametru de tip IN codul facultatii si returneaza in parametrii de tip OUT numele facultatii si locuri_camin suplimentate cu 10.

CREATE OR REPLACE PROCEDURE modifica_locuri (p_cod_fac IN Facultate.Cod_facultate%TYPE,p_nume OUT Facultate.Nume%TYPE,

p_locuri_camin OUT number) IS

BEGIN

SELECT Locuri_camin,Nume INTO p_locuri_camin,p_nume FROM Facultate WHERE Cod_facultate=p_cod_fac;

DBMS_OUTPUT.PUT_LINE('Facultatea se numeste '||p_nume||' si oferea '||p_locuri_camin||' locuri in camin');

UPDATE Facultate SET Locuri_camin=Locuri_camin+10 WHERE Cod_facultate=p_cod_fac;

SELECT Locuri_camin INTO p_locuri_camin FROM Facultate WHERE Cod_facultate=p_cod_fac;

DBMS_OUTPUT.PUT_LINE('Facultatea se numeste '||p_nume||' si ofera acum '||p_locuri_camin||' locuri in camin');

END;

/

SET SERVEROUTPUT ON

DECLARE

v_nume Facultate.Nume%TYPE;

v_locuri_camin Facultate.Locuri_camin%TYPE;

BEGIN

modifica_locuri(109,v_nume,v_locuri_camin);

END;

/

Facultatea se numeste Cibernetica,Statistica si Informatica economica si oferea 510 locuri in camin

Facultatea se numeste Cibernetica,Statistica si Informatica economica si ofera acum 520 locuri in camin

3. Sa se calculze media mediilor studentilor inregistrati folosind procedura get_medie.

set serveroutput on

create or replace procedure get_medie (p_medie OUT Student.Media%TYPE) IS

BEGIN

SELECT avg(media) INTO p_medie FROM Student;

DBMS_OUTPUT.PUT_LINE('Media mediilor studentilor inregistrati este '||p_medie);

END;

/

set serveroutput on

DECLARE

v_medie number(3,2);

BEGIN

get_medie(v_medie);

END;

/

Media mediilor studentilor inregistrati este 8,45

Functii

4.Sa se creeze o noua coloana pt tabela Student : Tip_student.

Sa se creeze o functie care primeste ca parametru codul studentului si media mediilor tuturor studentilor inregistrati , iar daca media lui este mai mare decat media mediilor sa se returneze true, false daca este mai mica si null daca nu s-a gasit codul studentului.

CREATE OR REPLACE FUNCTION verifica_stud

(p_cod IN student.cod_student%type, p_medie IN number)

RETURN BOOLEAN

IS

v_medie student.media%type;

BEGIN

SELECT media into v_medie from student where cod_student=p_cod;

IF v_medie > p_medie then

return true;

ELSE

return false;

end if;

exception when no_data_found then

return NULL;

end;

/

--apelam procedura care calculeaza media mediilor tuturor studentilor inregistrati

set serveroutput on

declare

v_medie student.Media%TYPE;

begin

get_medie(v_medie);

--apelam functia verifica_stud pt studentul al carui cod este 5002

IF(verifica_stud(5002,v_medie) IS NULL) THEN

DBMS_OUTPUT.PUT_LINE('Nu exista nici un student cu codul 5002');

ELSIF (verifica_stud(5002,v_medie)) THEN

DBMS_OUTPUT.PUT_LINE('Studentul are media mai mare decat media tuturor=> este foarte bun');

else

DBMS_OUTPUT.PUT_LINE('Studentul are media mai mica decat media tuturor=> este bun');

end if;

end;

/

Media mediilor studentilor inregistrati este 8,45

Studentul are media mai mare decat media tuturor=> este foarte bun

5. Sa se realizeze o functie care afiseaza numarul de studenti care nu prind camin, pt un anumit cod al facultatii introdus ca si parametru.

set serveroutput on

create or replace function studenti_fara_camin (numar_stud IN number,loc_camin IN number)

RETURN number is

begin

return (numar_stud-loc_camin);

end studenti_fara_camin;

/

--apelul funciei

SELECT cod_facultate, numar_studenti, locuri_camin, studenti_fara_camin(numar_studenti, locuri_camin) as fara_camin

FROM facultate;

6. Sa se creeze un pachet care contine o procedura modifica_locuri modifica numele facultatii.

CREATE or replace package actualizare_pachet is

PROCEDURE modifica_facultate (p_cod_fac Facultate.Cod_facultate%TYPE,p_nume Facultate.Nume%TYPE);

function exista_cod(p_cod_fac Facultate.cod_facultate%TYPE) return boolean;

end;

/

create or replace package body actualizare_pachet is

procedure modifica_facultate

(p_cod_fac facultate.cod_facultate%TYPE,

p_nume facultate.nume%type)

is

begin

if exista_cod(p_cod_fac) then

update facultate

set nume=p_nume where cod_facultate=p_cod_fac;

dbms_output.put_line('S-a modificat numele facultatii');

else

dbms_output.put_line('Nu exista nici o facultate cu acest nume');

end if;

end;

function exista_cod(p_cod_fac facultate.Cod_facultate%type)

return boolean

is

v_unu number;

begin

select 1 into v_unu

from facultate

where cod_facultate=p_cod_fac;

return true;

exception

when no_data_found then

return false;

end;

END;

/

G. Declanatori la nivel de instruciune i de rnd

1. Sa se creeze un trigger care se declanseaza inainte de fiecare stergere din tabela adresa_facultate;

la nivel de instructiune

CREATE OR REPLACE TRIGGER adresa_trigger

BEFORE delete on adresa_facultate

BEGIN

dbms_output.put_line('triggerul s-a executat');

END;

/

delete from adresa_facultate where cod_facultate=110;

2. Sa se creeze un trigger care se declanseaza inainte de fiecare modificare in tabela adresa_facultate.

CREATE OR REPLACE TRIGGER adresa_trigger

BEFORE update on adresa_facultate

BEGIN

dbms_output.put_line('triggerul s-a executat');

END;

/

update adresa_facultate set adresa='o adresa' where cod_facultate=105;

select * from adresa_facultate;

la nivel de rand

3. Sa se creeze un trigger care nu permite introducerea unui salariu mai mare decat valoarea maxima pt un nume specificat.

CREATE OR REPLACE TRIGGER restrict_salariu

BEFORE INSERT or UPDATE on administrator

FOR EACH ROW

DECLARE

v_sal_max number;

BEGIN

select max(salariu) into v_sal_max from administrator where nume=:new.nume;

IF :new.salariu>v_sal_max then

RAISE_APPLICATION_ERROR (-20202, 'Nu se poate depasi salariul maxim pentru numele dat');

end if;

END;

/

update administrator

set salariu =6000

where cod_administrator=400;

4. Sa se creeze un trigger la nivel de rand care nu permite introducerea unei medii mai mari de media maxima a studentilor.

CREATE OR REPLACE TRIGGER restrict_media

BEFORE INSERT on student

FOR EACH ROW

DECLARE

v_medie number;

BEGIN

select max(media) into v_medie from student where nume=:new.nume;

IF :new.media>v_medie then

RAISE_APPLICATION_ERROR (-20202, 'Nu se poate depasi salariul maxim');

end if;

END;

/

insert into student(cod_student,cod_universitate,cod_facultate,nume,media) values (123,1000,105,'Ionel',10);

APEX

https://apex.oracle.com/pls/apex/f?p=4000:1:7107209493841::NO:RP:FB_FLOW_ID,F4000_P1_FLOW,P0_FLOWPAGE,RECENT_PAGES:63428,63428,63428

1. Creati un raport si o macheta de intrare pentru tabela Universitate.

https://apex.oracle.com/pls/apex/f?p=82972:1:11078923647092:::::

2. Creati un raport si o macheta de intrare pentru tabela Facultate.

https://apex.oracle.com/pls/apex/f?p=70780:1:116760987977346:::::

https://apex.oracle.com/pls/apex/f?p=83606:2:100561836927136:::::