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;