Menu

10 Aralık 2008 Çarşamba

Exception Handling (Hata Yakalama)

Her programlama dilinde oldugu gibi Oracle ‘ın prosedürel veritabanı programlama dili olan PL/SQL de de gerek derleme sırasında(compile time), gerekse programın çalışması esnasında(run time) hata durumu ortaya çıkabilir.Bu yazıda bunların tespit edip yakalama ve program akışını buna göre düzenlemeye yönelik kısa bilgiler bulacaksınız.

PL/SQL de işlemi gercekleştirecek kod parcacıkları fonksiyon, procedür ya da script seklinde bir kod blogu ile olabilir.Hepsinin ortak yanı :


declare
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
end;

şeklinde bir bloktan oluşmalarıdır.NOT : Fonksiyon ve prosedür için örnekler şu şeklide verilebilir :


Fonksiyon örneği :
function fonksiyonXXX(param1 varchar2,param2 number….) return aDataType is
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
return aDataType;
end fonksiyonXXX;

Procedür örneği :
procedure procedurXXX (param1 varchar2,param2 number….) is
–gerekirse değişken tanımları
begin
…………
………….
……………
……………….
end prosedurXXX;

Türü ne olursa olsun hata yönetimi yapmak, hatayı yakalamak için her begin-end; bloğu arasında bu blokta olusacak hata için “exception” anahtar kelimesi kullanılmalıdır.

declare
begin
….
…..
….

exception
………………
end;

“exception” kısmında “end;” sonuna kadar olan kısımda, alınan birden fazla hatayı yakalamak mümkün.Bunun için “when” anahtar kelimesini kullanılır.

begin
……..
……….
………
exception
when exception1 then
———gerekli kodlar
——————–
when exception2 then
———gerekli kodlar
————–
when others then
————
.
.
end;

“exception1, exception2, …exceptionN” önceden tanımlı bir hata olabileceği gibi ,tanımsız olan herhangibir hata ya da kullanıcının tanımladıgı bir hata da olabilir.Önceden tanımlı hatalara örnek olarak

no_data_found
to_many_rows
zero_divide
…..
verilebilir.Bazı önceden tanımlı hatalar ve kodları aşağıda verilmiştir.


Exception Oracle Error SQLCODE Value
ACCESS_INTO_NULL ORA-06530 -6530
CASE_NOT_FOUND ORA-06592 -6592
COLLECTION_IS_NULL ORA-06531 -6531
CURSOR_ALREADY_OPEN ORA-06511 -6511
DUP_VAL_ON_INDEX ORA-00001 -1
INVALID_CURSOR ORA-01001 -1001
INVALID_NUMBER ORA-01722 -1722
LOGIN_DENIED ORA-01017 -1017
NO_DATA_FOUND ORA-01403 +100
NOT_LOGGED_ON ORA-01012 -1012
PROGRAM_ERROR ORA-06501 -6501
ROWTYPE_MISMATCH …………………….. ORA-06504 ……………………. -6504 …………………

Önceden tanımlı hata kodları ile tanımı olmayan diger hatalarda muhakkak bir hata kodu(ORA-xyzwt) bulunmaktadır.Belirli bir hatayı değilde alınan herhangibir ya da belirtilmeyen başka hataları yakalamak için “when” den sonra “others” kullanılır.

NOT : Oracle , hata oluştugu anda bu hataya ait hata kodunu “sqlcode” değişkenine, hata acıklamasını da “sqlerrm” değişkenine otomatik olarak atar.Bunlar gerekirse okunarak kullanılabilir.Kullanıcı tanımlı hatalar için de öncelikte hata değişkeni tanımı yapılmalıdır.Bunun herhangibir veri tipi tanımlamadan farkı yoktur.

declare
something_wrong exception;
declare
if(…) then
raise someting_wrong;
…………….
………
exception
when something_wrong then
–gerekli işlemler…
when others then
–gerekli işlemler….
end;

“exception” bloğuna düşen hatada bir takım işlemler yapılabileceği gibi bu PL/SQL kodunu çağıran yere de bir hata fırlatmak isteyebiliriz.(throw exception).Bunun içinde “raise _applicaion_error(errorID, errorDesc)” kullanılır.“errorID” ve “errorDesc” alanlarını kullanıcı belirler.”errorID” [-20000,-20999] arasında bir değer olmalıdır.”errorDesc” alanıda en fazla 2000 karakterlik “varchar2” veri tipinde açıklama yazılabilir.

Örneğin bir prosedürümüz olsun ve bu prosedür basitçe gönderilen parametrenin 1000’den büyük olup olmadıgını kontrol etsin.Büyük ise yukarı hata versin.

procedure prc_checkValue(p_vlaue number) is
begin
if(p_value > 1000) then
raise_application_error(-20010,’Value is too large);
end;

Bunu yapmanın bir başka yoluda bir hata tanımlayıp bu hatayı “raise etmek :

procedure prc_checkValue(p_vlaue number) is
too_large exception;
begin
if(p_value > 1000) then
raise too_large;
exception
when too_large then
raise_application_error(-20010,’Value is too large);
end;

2 yorum:

  1. Hello, i think that i saw you visited my weblog so i came to “return the favor”.
    I'm attempting to find things to enhance my site!I suppose its ok to use a few of your ideas!!

    Also visit my blog; cellulite treatment reviews

    YanıtlaSil