Başlangıç > Database, Forms, Hata, Oracle, PL/SQL, Reports > ora-01476:divisor is equal to zero hatası

ora-01476:divisor is equal to zero hatası


Merhaba
Yazdığımız programlarda zaman zaman matematiksel işlemlerde kullanılırız. Toplama, çıkarma, çarpma ve bölme gibi. Bölme dışında diğer işlemlerde çok fazla sorunumuz olmaz fakat bir sayının sıfıra (0) bölünmeye çalışıldığı bir anda pl/sql ortamında bize ora-01476 hatası verilir. Bu hata bölen sıfıra eşittir hatasıdır ve bildiğiniz gibi bir matematiksel işlemde hiçbir zaman bölen sıfır olamaz. Bir sayının sıfıra bölünmesinin sonucu sonsuzdur (∞) ve bu sebeple sistem bize bir bölme işleminde bölen sıfır olduğu zaman hata verir. Şimdi birkaç örnek yapalım ve bu hata nasıl alınır ve hata almamak için neler yapabiliriz onlara bakalım.

declare
  cursor cSayi is
    select rownum deger
      from dual
    connect by rownum <= 10
     order by rownum desc;

  vIslem varchar2(30);
  vSonuc number;
begin
  for rSayi in cSayi loop
    begin
      vIslem := rSayi.deger || '/' || (rSayi.deger - 1) || '=';
      
      vSonuc := round((rSayi.deger / (rSayi.deger - 1)), 2);
    
      dbms_output.put_line(vIslem || vSonuc);
    exception
      when others then
        dbms_output.put_line(vIslem || ' Hata:' || sqlerrm);
    end;
  end loop;
end;

Yukarı işlem çalıştığında son işlem olan 1/0 için hata verecektir ve bu hatayı çıktıda görebiliriz.

10/9=1,11
9/8=1,13
8/7=1,14
7/6=1,17
6/5=1,2
5/4=1,25
4/3=1,33
3/2=1,5
2/1=2
1/0= Hata:ORA-01476: bölen sıfıra eşittir

Görüldüğü gibi sıfıra bölme işlemini yapamadık. Bu gibi durumlarda doğru bir hata ayıklama kodu ile ya da mantıksal kontrol ile sorunların önüne geçebiliriz. Daha önce pl/sql de exception kullanımı yazımda anlattığım gibi [zero_divide] exception yöntemi ile kodunuzu düzenleyebilir ya da matematiksel işlemin öncesinde bir if kontrolü ile bölen sıfır olduğunda işlemi değiştirerek sorunuz çözebilirsiniz. Yukardaki kodumuzun içinde bir if kontrolü ile aşağıdaki sonuçları alabiliriz.

declare
  cursor cSayi is
    select rownum deger
      from dual
    connect by rownum <= 10
     order by rownum desc;

  vIslem varchar2(30);
  vSonuc number;
begin
  for rSayi in cSayi loop
    begin
      vIslem := rSayi.deger || '/' || (rSayi.deger - 1) || '=';
    
      if (rSayi.deger - 1) = 0 then --Bu if kodu ile hata almadan işlemimizi sonuçlandırabiliriz.
        vSonuc := round((rSayi.deger / 1), 2);
      else
        vSonuc := round((rSayi.deger / (rSayi.deger - 1)), 2);
      end if;
      
      dbms_output.put_line(vIslem || vSonuc);
    exception
      when others then
        dbms_output.put_line(vIslem || ' Hata:' || sqlerrm);
    end;
  end loop;
end;
10/9=1,11
9/8=1,13
8/7=1,14
7/6=1,17
6/5=1,2
5/4=1,25
4/3=1,33
3/2=1,5
2/1=2
1/0=1

Bu işlemin sonucuna baktığımızda hata almadığımızı ve 1/0 işleminin 1 değerini verdiğini görebiliriz. Tabii ki bu mantıklı bir işlem değil ben sadece farkın anlaşılması için mantıksal düzeltme yapmadan sonuçların görülmesini sağladım.

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: