Başlangıç > Database, Forms, Oracle, PL/SQL, Reports > pl/sql de exception kullanımı

pl/sql de exception kullanımı


Merhaba

Her işlemde olduğu gibi yazılım geliştirmede de hatalar alırız.error Önemli olan hata almak değil aldığımız ya da almayı beklediğimiz hataları doğru bir şekilde yönetmektir. Hazırladığımız programlarda doğru bir hata yönetimi yaparsak bize bu hatalar için çok az geri dönüş olur. Ama doğru bir hata yönetimi yapmayıp olduğu gibi düz bir planda programlarımızı geliştirirsek geri dönen hataları ayıklamak ve düzeltmek programı yazmak için harcadığımız zamandan fazlasını alır. Bu bilgiler doğrultusunda doğru bir exception kullanımı ile pl/sql de geliştirdiğimiz programlarımızda hata yönetimini yapabiliriz. Temel olarak iki çeşit exception kullanımı mevcuttur. Birincisi pl/sql de sistem tarafından bizim için tanımlanan exception türlerinin kullanımı. İkincisi ise bizim tanımlayacağımız exception türlerinin kullanımıdır.

Pl/Sql de hazır bulunan exception türlerinden bazıları şunlardır;

  1. no_data_found
  2. zero_divide
  3. too_many_rows
  4. dup_val_on_index
  5. others

Bu şekilde devam edip gider. Burada tüm exception tiplerini anlatmayacağım. Sadece genel olarak çok kullanılan exception tiplerine değineceğim. Şimdi sırasıyla bu exception türlerini örnekler ile inceleyelim.

[no_data_found]
Bu exception kullanımı bir tablodan sorgu sonucu hiç kayıt gelmediği durumlarda alınan hatayı yakalamak içindir.

declare
  vOwner varchar2(50);
begin

  begin
    select owner into vOwner from all_tables where owner = 'ABCDEF';
  exception
    when others then
      dbms_output.put_line('Alınan Hata:' || sqlerrm);
  end;

end;

Bu kod bloğu çalıştığında output çıktısı olarak “Alınan Hata:ORA-01403: no data found” hatası olacaktır. Halbuki biz bu hatayı others türünde bir exception yerine no_data_found ile yönetirsek daha sağlıklı bir işlem yapmış oluruz ve sonrasında kodu okuduğumuzda bir kayıt bulunamadığında ne yaptığımızı ya da yapmamız gerektiğini anlarız. Aynı kod bloğunu şimdi de olması gereken no_data_found tipindeki exception ile yönetelim.

declare
  vOwner varchar2(50);
begin

  begin
    select owner into vOwner from all_tables where owner = 'ABCDEF';
  exception
    when no_data_found then
      dbms_output.put_line('exception when no_data_found then >> Hiç kayıt bulunamadı');
  end;

end;

Yukarıdaki gibi olması gereken bir şekilde hatayı yönettiğimizde ise output çıktısı olarak eklediğimiz “exception when no_data_found then >> Hiç kayıt bulunamadı” mesajını alırız.

[zero_divide]
Bu exception kullanımı bir matematiksel işlemde bölenin sıfır olması durumlarında alınan hatayı yakalamak içindir.

declare
  vSonuc number;
begin

  begin
    select 100 / 0 into vSonuc from dual;
  exception
    when others then
      dbms_output.put_line('Alınan Hata:' || sqlerrm);
  end;

end;

Bu kod bloğu çalıştığında output çıktısı olarak “Alınan Hata:ORA-01476: divisor is equal to zero” hatası olacaktır. Bu işlem için hatayı others türünde bir exception yerine zero_divide ile yönetirsek daha sağlıklı bir işlem yapmış oluruz ve sonrasında kodu okuduğumuzda matematiksel bir işlemde bölen sıfır olduğunda ne yaptığımızı ya da yapmamız gerektiğini anlarız. Aynı kod bloğunu şimdi de olması gereken zero_divide tipindeki exception ile yönetelim.

declare
  vSonuc number;
begin

 begin
    select 100 / 0 into vSonuc from dual;
  exception
    when zero_divide then
      dbms_output.put_line('exception when zero_divide then >> Bölen sıfır olamaz');
  end;

end;

Yukarıdaki gibi olması gereken bir şekilde hatayı yönettiğimizde ise output çıktısı olarak eklediğimiz “exception when zero_divide then >> Bölen sıfır olamaz” mesajını alırız.

[too_many_rows]
Bu exception kullanımı bir tablodan sorgu sonucu birden fazla kayıt geldiği durumlarda alınan hatayı yakalamak içindir.

declare
  vSonuc varchar2(50);
begin

  begin
    select owner into vSonuc from all_tables where owner = 'SYS';
  exception
    when others then
      dbms_output.put_line('Alınan Hata:' || sqlerrm);
  end;

end;

Bu kod bloğu çalıştığında output çıktısı olarak “Alınan Hata:ORA-01422: exact fetch returns more than requested number of rows” hatası olacaktır. Bu işlem için hatayı others türünde bir exception yerine too_many_rows ile yönetirsek daha sağlıklı bir işlem yapmış oluruz ve sonrasında kodu okuduğumuzda bir tablodan kayıt çektiğimizde birden fazla kayıt gelince ne yaptığımızı ya da yapmamız gerektiğini anlarız. Aynı kod bloğunu şimdi de olması gereken too_many_rows tipindeki exception ile yönetelim.

declare
  vSonuc varchar2(50);
begin

  begin
    select owner into vSonuc from all_tables where owner = 'SYS';
  exception
    when too_many_rows then
      dbms_output.put_line('exception when too_many_rows then >> Birden fazla kayıt geldi');
  end;

end;

Yukarıdaki gibi olması gereken bir şekilde hatayı yönettiğimizde ise output çıktısı olarak eklediğimiz “exception when too_many_rows then >> Birden fazla kayıt geldi” mesajını alırız.

[dup_val_on_index]
Bu exception kullanımı bir tabloya insert işlemi yaparken tablodaki primary key olan alanlarıdaki aynı değerelere sahip başka bir kayıt eklemeye çalıştığımızda alınan hatayı yakalamak içindir. Bu işlem için bir tablo oluşturalım ve sonuçlara bakalım.

-- Create table
create table TABLE_001
(
  id       NUMBER not null,
  aciklama VARCHAR2(100)
);
-- Create/Recreate primary, unique and foreign key constraints
alter table TABLE_001  add constraint TBL_PK primary key (ID);

Tablomuz hazır olduğuna göre artık insert işlemini yapıp hatalarımızı kontol edelim.

declare
begin

  begin
    insert into table_001 (id, aciklama) values (1, 'İlk kayıt');
    commit;

    insert into table_001 (id, aciklama) values (1, 'İkinci kayıt');
    commit;
  exception
    when others then
      dbms_output.put_line('Alınan Hata:' || sqlerrm);
  end;

end;

Bu kod bloğu çalıştığında output çıktısı olarak “Alınan Hata:ORA-00001: unique constraint (TBL_PK) violated” hatası olacaktır. Bu işlem için hatayı others türünde bir exception yerine dup_val_on_index ile yönetirsek daha sağlıklı bir işlem yapmış oluruz ve sonrasında kodu okuduğumuzda bir tablonun primary key olan alanlarına aynı kayıtları atamayacağımızı ve ne yaptığımızı ya da yapmamız gerektiğini anlarız. Aynı kod bloğunu şimdi de olması gereken dup_val_on_index tipindeki exception ile yönetelim.

declare
begin

  begin
    insert into table_001 (id, aciklama) values (1, 'İlk kayıt');
    commit;

    insert into table_001 (id, aciklama) values (1, 'İkinci kayıt');
    commit;
  exception
    when dup_val_on_index then
      dbms_output.put_line('exception when dup_val_on_index then >> İlgili kayıt tabloda mevcut');
  end;

end;

Yukarıdaki gibi olması gereken bir şekilde hatayı yönettiğimizde ise output çıktısı olarak eklediğimiz “exception when dup_val_on_index then >> İlgili kayıt tabloda mevcut” mesajını alırız.

[others]
Bu exception kullanımı sistemde alınan tüm hataları yönetmek için kullanılır. Yazdığımız kodlarda nasıl bir hata geleceğini tahmin edemediğimiz noktlarda bu exception tipini kullanırız ve böylece sistem oluşan ve yönetilmeyen exception kalmaz.

declare
  vSonuc number;
begin
  --Number içerisine Char atamaya çalıştığım için ORA-06502 hatası alınacak ve hata
  --exception when others then bloğunda yakalanacak.
  vSonuc := 'Exception Others Yakalayacak';

exception
  when others then
    dbms_output.put_line('exception when others then >> Genel hata:' || sqlerrm);
end;

Yukarıdaki kod bloğu çalıştığında “exception when others then >> Genel hata:ORA-06502: PL/SQL: numeric or value error: character to number conversion error” mesajını alırız.
Sistem tarafından tanımlanan örnek exception tiplerini incelediğimize göre artık kendimiz bir exception türü hazırlayıp onu kullanalım. Örnek olarak all_all_tables tablosundan SMT kullanıcısı için kaç tane tablo kayıtlı olanları bulan bir sql çekelim ve toplam sayı 10’dan fazla ise hazırladığımız excepiton ile bu işlemi kontrol edelim.

[Kendi Hazırladığımız Exception]

declare
  vSonuc number;
  coktablovar exception;
begin
  select count(1) into vSonuc from all_all_tables where owner = 'SMT';

  if vSonuc > 10 then
    raise coktablovar;
  end if;
exception
  when coktablovar then
    dbms_output.put_line('SMT kullanıcısının 10''dan fazla tablosu var. Toplam tablo:' || vSonuc);
end;

Yukarıdaki kod içerisinde de görüleceği gibi coktablovar adında exception tipinde bir değişken tanımladık ve isteğimiz kontrol satırında da raise komutu ile tanımladığımız exception durumunu kontrol ettik. Bu kod bloğu çalıştığında “SMT kullanıcısının 10’dan fazla tablosu var. Toplam tablo:20” gibi bir output çıktısı oluşacaktır.
Kolay gelsin.

Reklamlar
  1. Henüz yorum yapılmamış.
  1. No trackbacks yet.

Bir Cevap Yazın

Aşağıya bilgilerinizi girin veya oturum açmak için bir simgeye tıklayın:

WordPress.com Logosu

WordPress.com hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Twitter resmi

Twitter hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Facebook fotoğrafı

Facebook hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Google+ fotoğrafı

Google+ hesabınızı kullanarak yorum yapıyorsunuz. Çıkış  Yap / Değiştir )

Connecting to %s

%d blogcu bunu beğendi: