Sunteți pe pagina 1din 3

SGBD Oracle Laborator

1. Pp ca o parte din codul nostrum o sa dea eroare. Incercam sa obtinem date despre
un angajat care nu exista. Trb sa vedem cum tratam posibilele cazuri de eroare.
Vom modifica putin sintaxa blocului.
Inainte de terminarea blocului putem trata asa numitele exceptii.
BEGIN
...
EXCEPTION
END;
In sesiunea de EXCEPTION trebuie sa prindem acele exceptii.Sectiunea
de try{} reprezinta partea de BEGIN pana la EXCEPTION, iar catch,
sesiunea de EXCEPTION. (try & catch de la Java, C#).
Notatie:
EXCEPTION
When tipException1 then
When tipException2 then
....
Avem o sectiune numita OTHERS
When others then (echivalentul lui exception prindem exceptiile
mai putin generale)
Tipuri de exceptii:
- when no_data_found incercam sa obtinem date din tabela dar selectul nostru nu
a returnat ceva;
- to_many_rows incercam sa introd date in variabila respectiva dar folosim un
select care returneaza mai multe randuri;
- mai multe exceptii vedem in capitolul 21

Jurnalizare:
Tabela de tip jurnal in care sa jurnalizam exceptiile
Avem o fct care se numeste SQLERRM care ne returneaza mesajul de eroare, SQLCODE
returneaza un cod al erorii
1. Sa facem 2 blocuri separate:
Facem un bloc in care sa obtina un salariu pt un angajat. Punem salariul intr-o variabila si
incercam sa-l impartim la nr de ani lucrati. Ar trebui sa rezulte un anumit nr. Pt un angajat
care nu exista ar trebui sa rezulte DIVISION BY ZERO.
In fct. de data angajarii calculam numarul de ani lucrati si impartim salariul la nr de ani.
Blocul respectiv va avea o sectiune de tip EXCEPTION in care tratam doar when
others (erorile generale), iar erorile generale le afisam deocamdata pe ecran.

Variabilele le putem declara local, in BEGIN.


Nume, prenume, salariu si data angajarii.
Va trebui sa detaliem sectiunea de exceptii pt ca atunci cand nu exista date pt angajat,
aplicatia noastra sa returneze zero, nu eroare pt diviziunea cu 0.
Sysdate-dataangajarii
Un ciclu generic
LOOP
...
END LOOP;
Ca sa iesim din ciclul infinit trb sa adaugam o conditie de iesire. Avem un EXIT WHEN
conditie;
LOOP
EXIST WHEN CONDITIE;
....
END LOOP;
Avem un ciclu cu nr finit de pasi (FOR)
FOR variabila IN valoareinferioara..valoaresuperioara
LOOP
...
END LOOP;
Exemplu:
for i in 1..10
loop
...
End loop;
WHILE CONDITIE
LOOP

END LOOP;
Incepem cu FOR:
Intr-un for vom afisa datele despre angajati: nume, prenume, salariu si marca (dbms..)
Luam marca angajatului, implementam cu 1 si afisam data despre angajat (select from
emp where marca =i)
Valoarea initiala poate sa fie 1, valoarea finala poate sa fie 1000 (de ex)
Val initiala poate sa fie min(employee_id) iar val finala max(employee_id)
Va trebui sa tratam exceptii pt ca s-ar putea ca un angajat cu marca 50 sa nu existe. Si sa
continuam daca nu exista un angajat cu o anumita marca.
Loop

Select nume, prenume


Where emp=1 (din for)
-Din lista totala de angajati sa ii afisam pe primii 10 care au salariul mai mare de 3000
vContor number;
If(salariu>1000) then
vContor=vContor+1;
End if
Exit when contor>10