Exception kelimesinin Türkçe karşılığı istisna demektir ve PL/SQL ‘de hataları yakalamak için kullanılan yapıya bu ad verilir. Exception blokları sayesinde kod içerisinde karşılaşılması öngörülen hatalar yakalanıp gerekli işlemler yapılabilir.
Eğer programımızda hata kontrolü yoksa programın çalışması durur ve programın kontrolü işletim sistemine döner. Hata kontrolü varsa da program hatalara rağmen devam edebilir.
Exception iki türlü tanımlanabilir :
- Sistem Tanımlı Exceptionlar(System Defined Exceptions)
- Kullanıcı Tanımlı Exceptionlar(User Defined Exceptions)
Kullanıcı Tanımlı Exceptionlar(User Defined Exceptions)
Bir uygulama yazıyorsunuz ve bu uygulamaya özel bazı hatalarınız oluşuyor ve bunları yakalamak ,ekrana bilgi vermek ya da loglamak istiyorsunuz. Bu gibi durumlarda PL/SQL sadece sistem tanımlı olan exceptionları değil kendi tanımladığınız hatalarınızı da yakalama şansı veriyor.
PL/SQL de hata tanımlaması yaparken aşağıdaki sintaksisi kullanıyoruz ;
DECLARE my-exception EXCEPTION;
Aşagıdaki örnekte bir exception tanımlıyoruz id’yi sıfır’ın altında girersek ex_invalid_id exceptionu çalışacak.Başka bir hata durumunda ise tanımlı gelen exceptionlardan birisi çalışacak.
NOT : Exception’ı hata olarak yakalaması için RAISE ifadesini kullandık. Raise’in karşılığı ‘uyandırmak’ olarak düşünülebilir ve burada ‘git ve oluşturduğum hatayı uyandır cevabını versin’ diyorsunuz
DECLARE v_id hr.employees.employee_id%type := &cc_id; v_name hr.employees.first_name%type; v_surn hr.employees.last_name%type; -- exception tanimlariz ex_invalid_id EXCEPTION; BEGIN --exception sartini belirtiriz IF v_id <= 0 THEN RAISE ex_invalid_id; ELSE SELECT first_name, last_name INTO v_name, v_surn FROM hr.employees WHERE employee_id = v_id; DBMS_OUTPUT.PUT_LINE ('Name: '|| v_name); DBMS_OUTPUT.PUT_LINE ('Surname: ' || v_surn); END IF; EXCEPTION --tanimladigimiz exception ise WHEN ex_invalid_id THEN dbms_output.put_line('ID must be greater than zero!'); WHEN no_data_found THEN dbms_output.put_line('No such customer!'); WHEN others THEN dbms_output.put_line('Error!'); END; /