07 - Practice Handling Exceptions




Shembull 1

Te ndertojme nje skript i cili duke perdorur "User Defined Exceptions" afishon sa here ka nderruar pune nje punonjes. 

Zgjidhje

  1. set serveroutput on;
  2. declare 
  3. eid number:=5000;
  4. here number;
  5. leviz exception;
  6. begin
  7. select count(*) into here 
  8. from job_history
  9. where employee_id=eid;

  10. if (here>0) then
  11. raise leviz;
  12. end if;
  13. dbms_output.put_line('Punonjesi '||eid||' nuk ka nderruar asnjehere pune');
  14. exception
  15. when leviz then
  16. dbms_output.put_line('punonjesi '||eid||' ka ndryshuar '||here||' here pune');
  17. end;

Ne rreshtin 5 skripti deklaron nje exception me emrin leviz. 
Ne rreshtat 7-9 ruan ne variablin here numrin e hereve qe punonjesi gjendet ne tabelen job_history, duke gjetur ne kete menyre numrin e hereve qe ai ka ndryshuar pune.
Ne rreshtat 11-13 kontrollohet nese numri i hereve qe perdoruesi ka ndryshuar pune eshte me i madh se zero. Nese po atehere ngrihet nje ceshtje ( raise leviz ) per tu trajtuar. Ceshtja ( exception) do te trajtohet me pas ne seksionin Exception.
Ne rreshtin 14 afishihet mesazi Punonjesi x nuk ka nderruar asnjehere pune.
Nese kushti i rreshtit 11 (here>0) eshte i vertete atehere kodi ne rreshtin 14 nuk do te ekzekutohet, prandaj edhe mesazhi nuk do te afishohet. Komanda e rreshtit 12 raise leviz, shkakton kapercimin e ekzekutimit te skriptit tek seksioni i trajtimit te ceshtjeve ( exception handling section) ne rreshtin 15.
Nese kushti i rreshtit 11 ( here>0) nuk eshte i vertete atehere skripti do te vazhdoje me ekzekutimin e kodin ne rreshtin 14 dhe me pas do te shmanget seksioni i trajtimit te ceshtjeve per shkak se nuk ka asnje ceshtje per tu trajtuar dho kodi do te spostohet ne rreshtin e 18 , qe shenon fundin e skriptit.

Skripti me lart nese ekzekutohet me vleren e eid=5000 do te shfaqe:

anonymous block completed
Punonjesi 5000 nuk ka nderruar asnjehere pune

duke qene se punonjesi 5000 nuk ekziston dhe nuk ka nderruar pune
ndersa nese do ta ekzekutojme me eid=200 atehere do te shfaqe:

anonymous block completed
punonjesi 200 ka ndryshuar 2 here pune

Duke qene se kodi i punonjesit 200 gjendet dy here ne tabelen job_history.


Shembull 2

Hint: Exception handling inside a function

Ta rishkruajme funksionalitetin e mesiperm duke e konveruar skriptin ne nje funksion i cili merr si argument kodin e nje punonjesi dhe kthen numrin e hereve qe ai ka nderruar pozicion pune


Zgjidhje


  1. CREATE OR REPLACE FUNCTION ndryshim
  2. (
  3. eid number
  4. )
  5. return NUMBER
  6. IS
  7. here number;
  8. leviz exception;
  9. begin
  10. select count(*) into here 
  11. from job_history
  12. where employee_id=eid;
  13. if (here>0) then
  14. raise leviz;
  15. end if;
  16. return here;
  17. exception
  18. when leviz then
  19. return here;
  20. end;

Ne funksionin me kart per efekte te sintakses eshte hequr fjala kyce declare dhe seksioni deklarimit fillon me fjalen kyce IS(rreshti 6)  dhe perfundon me fjalen kyce begin ( rreshti 9).

ne rreshtin 14 nese (here>0) eshte i vertete atehere ngrihet nje ceshtje per tu trajtuar, dhe ekzekutimi kercen menjehere tek rreshti 17 , ne seksionin e trajtimit te ceshtjeve.
Ndersa nese kushti nuk eshte i vertete ekzekutimi vazhdon me rreshtin 16 return here;  Kjo komande dek nga funksioni dhe kthen vleren e variablit here qe rezultoi te jete i barabarte me  0.
Ndersa nese ekzekutimi u transferua ne seksionin e trajtimit te ceshtjeve do te verifikohet qe eshte ngritur ceshtja leviz  dhe do te ekzekutohet kodi i rreshtit 19 return here; i cili gjithashtu do te dale nga funksioni duke kthyer vleren e variablit here i cili rezultoi te jete me i madh se 0.


Shembull 3



Hint: Procedure me "Named System Exception"


create or replace procedure proc2
(
eid IN number,
emri out varchar2,
mbiemri out varchar2
)
IS
BEGIN

SELECT first_name,last_name into emri,mbiemri
from employees 
where employee_id=eid;

EXCEPTION
when NO_DATA_FOUND THEN
emri:='not found';
mbiemri:='not found';

END;



therritja e procedures

set SERVEROUTPUT  on;
declare
eid number:=200;
fname varchar(50);
lname varchar(50);

BEGIN
proc2(eid,fname,lname);
dbms_output.put_line(fname);
dbms_output.put_line(lname);


END;









Shembull 4


Hint: Procedure me  user defined exceptions


create or replace procedure proc3
(
eid IN number,
emri out varchar2,
mbiemri out varchar2,
shenime out varchar2
)
IS
i number;
here number;
employee_not_found exception;
stabel exception;
BEGIN

select count(*) into i 
from employees 
where employee_id=eid;

if (i<1) then
raise employee_not_found;
end if;

SELECT first_name,last_name into emri,mbiemri
from employees 
where employee_id=eid;

select count(*) into here 
from job_history where employee_id=eid;

if(here<1) then
raise stabel;
end if;

shenime:=('Punonjesi ka ndryshuar pune '||here||'here');

EXCEPTION
when employee_not_found THEN
emri:='not found';
mbiemri:='not found';
shenime:='not found';
when stabel then
shenime:='punonjesi nuk ka ndryshuar asnjehere pune';
END;



Ekzekutimi i procedures




set SERVEROUTPUT  on;
declare
eid number:=200;
fname varchar(50);
lname varchar(50);
notes varchar(250);
BEGIN
proc3(eid,fname,lname,notes);
dbms_output.put_line(fname);
dbms_output.put_line(lname);
dbms_output.put_line(notes);

END;