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
set serveroutput on;
declare
eid number:=5000;
here number;
leviz exception;
begin
select count(*) into here
from job_history
where employee_id=eid;
if (here>0) then
raise leviz;
end if;
dbms_output.put_line('Punonjesi '||eid||' nuk ka nderruar asnjehere pune');
exception
when leviz then
dbms_output.put_line('punonjesi '||eid||' ka ndryshuar '||here||' here pune');
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
CREATE OR REPLACE FUNCTION ndryshim
(
eid number
)
return NUMBER
IS
here number;
leviz exception;
begin
select count(*) into here
from job_history
where employee_id=eid;
if (here>0) then
raise leviz;
end if;
return here;
exception
when leviz then
return here;
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;