İstisna İşleme Oracle PL/SQL (Örnekler)
⚡ Akıllı Özet
İstisna yönetimi Oracle PL/SQL, bir bloğun yürütülmesini durduran çalışma zamanı hatalarını yakalar ve motorun kontrolü, önceden tanımlanmış, kullanıcı tanımlı ve DİĞER işleyicilerin hatalara güvenli bir şekilde yanıt verdiği, hata oluşturduğu veya hataları yaydığı bir İSTİSNA bölümüne aktarmasına olanak tanır.

PL/SQL'de İstisna İşleme Nedir?
PL/SQL motoru, çalışma zamanında ortaya çıkan bir hata nedeniyle yürütemediği bir komutla karşılaştığında bir istisna oluşur. Bu hatalar derleme zamanında tespit edilmez ve bu nedenle yalnızca çalışma zamanında ele alınmalıdır.
Örneğin, PL/SQL motoru bir sayıyı sıfıra bölme komutu aldığında, hatayı bir istisna olarak yükseltir. Bu istisna yalnızca çalışma zamanında PL/SQL motoru tarafından yükseltilir.
Bir istisna, programın daha fazla çalışmasını durdurur; bu nedenle, böyle bir durumdan kaçınmak için hatanın yakalanması ve ayrı olarak ele alınması gerekir. Bu işleme istisna işleme denir ve programcı, çalışma zamanında oluşabilecek hatayı ele alır.
İstisna İşleme Sözdizimi
İstisnalar blok düzeyinde ele alınır. Bir blokta bir istisna oluştuğunda, kontrol o bloğun yürütme bölümünden ayrılır ve istisna daha sonra bloğun istisna işleme bölümünde ele alınır. İstisna ele alındıktan sonra, kontrol aynı bloğun yürütme bölümüne geri dönemez.
Aşağıdaki şekil, yürütme bölümünün ve istisna işleme bölümünün tek bir PL/SQL bloğu içinde nasıl yer aldığını göstermektedir:
Aşağıdaki sözdizimi, bir istisnanın nasıl yakalanacağını ve ele alınacağını açıklamaktadır.
BEGIN <execution block> . . EXCEPTION WHEN <exceptionl_name> THEN <Exception handling code for the “exception 1 _name’' > WHEN OTHERS THEN <Default exception handling code for all exceptions > END;
Sözdizimi Açıklaması:
- Yukarıdaki sözdiziminde, istisna işleme bloğu, istisnaları ele almak için bir dizi WHEN koşulu içerir.
- Her WHEN koşulunun ardından, çalışma zamanında ortaya çıkması beklenen bir istisna adı gelir.
- Çalışma zamanında bir istisna oluştuğunda, PL/SQL motoru, ilk WHEN koşulundan başlayarak sırayla ilerleyerek, istisna işleme bölümünde söz konusu istisnayı arar.
- Oluşan istisna için bir işleyici bulursa, o işleyici kodunu yürütür.
- Eğer hiçbir WHEN koşulu, ortaya çıkan istisnaya uymuyorsa, PL/SQL motoru, varsa WHEN OTHERS bölümünü yürütür. Bu işleyici tüm istisnalar için ortaktır.
- İşleyici çalıştıktan sonra, kontrol mevcut bloğu terk eder.
- Çalışma zamanında bir blok için yalnızca bir istisna işleyici çalıştırılabilir. Bu işleyici çalıştıktan sonra, motor kalan işleyicileri atlar ve mevcut bloğu terk eder.
Not: WHEN OTHERS her zaman sıralamanın en sonuna yerleştirilmelidir. WHEN OTHERS'tan sonra yazılan herhangi bir işleyici asla çalışmaz, çünkü WHEN OTHERS yürütüldükten sonra kontrol bloktan çıkar.
İstisna Türleri
İstisnaların iki türü vardır. PL / SQL.
- Önceden tanımlanmış istisnalar
- Kullanıcı tanımlı istisnalar
Önceden Tanımlanmış İstisnalar
Oracle Bazı yaygın istisnalar önceden tanımlanmıştır. Her önceden tanımlanmış istisnanın benzersiz bir adı ve hata numarası vardır ve bunların tümü STANDARD paketinde bildirilmiştir. OracleKodda, ilgili hataları işlemek için bu önceden tanımlanmış istisna adlarını doğrudan kullanabilirsiniz. Bunların çoğu doğrudan yaygın olanlara karşılık gelir. SQL Her gün karşılaştığınız hatalar.
Aşağıda önceden tanımlanmış birkaç istisna bulunmaktadır:
| Istisna | Hata Code | İstisna Nedeni |
|---|---|---|
| ACCESS_INTO_NULL | ORA-06530 | Başlatılmamış bir nesnenin özniteliklerine değer atama |
| CASE_NOT_FOUND | ORA-06592 | CASE ifadesindeki WHEN koşullarının hiçbiri karşılanmıyor ve ELSE koşulu da belirtilmemiş. |
| COLLECTION_IS_NULL | ORA-06531 | Başlatılmamış bir koleksiyon üzerinde koleksiyon yöntemlerini (EXISTS hariç) kullanmak veya koleksiyon özniteliklerine erişmek |
| CURSOR_ALREADY_OPEN | ORA-06511 | Bir açmaya çalışıyorum imleç zaten açık olan |
| DUP_VAL_ON_INDEX | ORA-00001 | Benzersiz bir indeksle sınırlandırılmış bir veritabanı sütununda yinelenen bir değerin saklanması |
| INVALID_CURSOR | ORA-01001 | Yasadışı imleç işlemleri, örneğin açılmamış bir imleci kapatmak. |
| GEÇERSİZ NUMARA | ORA-01722 | Geçersiz bir sayısal karakter nedeniyle karakterin sayıya dönüştürülmesi başarısız oldu. |
| VERİ BULUNAMADI | ORA-01403 | İçinde INTO yan tümcesi bulunan bir SELECT sorgusu hiçbir satır getirmez. |
| ROW_MISMATCH | ORA-06504 | İmleç değişkeninin veri türü, imlecin gerçek dönüş türüyle uyumlu değil. |
| SUBSCRIPT_BEYOND_COUNT | ORA-06533 | Bir koleksiyona, koleksiyon boyutundan daha büyük bir indeks numarasıyla atıfta bulunmak. |
| SUBSCRIPT_OUTSIDE_LIMIT | ORA-06532 | Yasal aralığın dışında bir indeks numarasıyla (örneğin, -1) bir koleksiyona atıfta bulunmak. |
| TOO_MANY_ROWS | ORA-01422 | INTO yan tümcesi içeren bir SELECT sorgusu birden fazla satır döndürür. |
| VALUE_ERROR | ORA-06502 | Aritmetik veya boyut kısıtlama hatası (örneğin, değişken boyutundan daha büyük bir değer atama) |
| ZERO_DIVIDE | ORA-01476 | Bir sayıyı sıfıra bölmek |
Kullanıcı Tanımlı İstisna
Yukarıda belirtilen önceden tanımlanmış istisnalara ek olarak, bir programcı özel istisnalar oluşturabilir ve bunları işleyebilir. Bunlar, alt program düzeyinde bildirim bölümünde oluşturulur ve yalnızca o alt program içinde görünür. Bir paket belirtiminde tanımlanan bir istisna, herkese açık bir istisnadır ve pakete erişilebilen her yerde görünür.
Sözdizimi: Alt program düzeyinde
DECLARE <exception_name> EXCEPTION; BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> END;
- Yukarıdaki sözdiziminde, 'exception_name' değişkeni EXCEPTION türü olarak tanımlanmıştır.
- Bu durumda, önceden tanımlanmış bir istisna gibi kullanılabilir.
Sözdizimi: Paket belirtim seviyesinde
CREATE PACKAGE <package_name> IS <exception_name> EXCEPTION; . . END <package_name>;
- Yukarıdaki sözdiziminde, 'exception_name' değişkeni, paket belirtiminde EXCEPTION türü olarak tanımlanmıştır. .
- Bu, veritabanında 'package_name' paketinin çağrılabileceği her yerde kullanılabilir.
PL/SQL Yükseltme İstisnası
Önceden tanımlanmış tüm istisnalar, ilgili hata oluştuğunda otomatik olarak tetiklenir. Ancak, kullanıcı tanımlı istisnalar, RAISE anahtar kelimesi kullanılarak açıkça tetiklenmelidir. RAISE aşağıdaki şekillerde kullanılabilir.
RAISE ifadesi bir hata işleyici içinde tek başına kullanıldığında, zaten oluşturulmuş olan istisnayı üst bloğa iletir. Aşağıda gösterildiği gibi, yalnızca bir istisna bloğu içinde kullanılabilir.
Aşağıdaki ekran görüntüsü, bir istisnayı çevreleyen bloğa yeniden fırlatmak için RAISE komutunun tek başına nasıl kullanıldığını göstermektedir:
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> EXCEPTION WHEN <exception_name> THEN <Handler> RAISE; END;
Sözdizimi Açıklaması:
- Yukarıdaki sözdiziminde, RAISE anahtar kelimesi istisna işleme bloğunun içinde kullanılmıştır.
- Program 'exception_name' istisnasıyla karşılaştığında, istisna ele alınır ve normal şekilde tamamlanır.
- Hata işleyicisindeki RAISE anahtar kelimesi, aynı istisnayı üst programa iletir.
Not: Üst bloğa bir istisna gönderilirken, gönderilen istisnanın üst blokta da görünür olması gerekir; aksi takdirde Oracle hata atar.
Ayrıca, belirli bir kullanıcı tanımlı veya önceden tanımlanmış istisnayı yükseltmek için RAISE anahtar kelimesini ve ardından istisna adını kullanabilirsiniz. Bu yöntem hem yürütme bölümünde hem de istisna işleme bölümünde kullanılabilir.
Aşağıdaki ekran görüntüsünde, belirli bir istisnayı tetiklemek için RAISE komutunun ardından istisna adı yazılması gösterilmektedir:
CREATE [ PROCEDURE | FUNCTION ] AS BEGIN <Execution block> RAISE <exception_name> EXCEPTION WHEN <exception_name> THEN <Handler> END;
Sözdizimi Açıklaması:
- Yukarıdaki sözdiziminde, yürütme bölümünde RAISE anahtar kelimesi kullanılır, ardından 'exception_name' istisnası gelir.
- Bu durum, çalışma zamanında söz konusu istisnayı ortaya çıkarır ve bunun daha sonra ele alınması veya daha ileriye taşınması gerekir.
Örnek 1: Bu örnekte şunları göreceğiz:
- İstisna nasıl tanımlanır?
- Bildirilen istisna nasıl yükseltilir?
- Ana bloğa nasıl yayılır
Aşağıdaki ekran görüntüsü, sample_exception'ı tanımlayan, iç içe bir blok içinde bu istisnayı oluşturan ve ana bloğa ileten eksiksiz kod bloğunu göstermektedir:
Aşağıdaki ekran görüntüsü, ana bloğun yayılan istisnayı nihayet yakaladığı aynı örneğin devamını göstermektedir:
DECLARE Sample_exception EXCEPTION; PROCEDURE nested_block IS BEGIN Dbms_output.put_line('Inside nested block'); Dbms_output.put_line('Raising sample_exception from nested block'); RAISE sample_exception; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line ('Exception captured in nested block. Raising to main block'); RAISE; END; BEGIN Dbms_output.put_line('Inside main block'); Dbms_output.put_line('Calling nested block'); Nested_block; EXCEPTION WHEN sample_exception THEN Dbms_output.put_line ('Exception captured in main block'); END; /
Code Açıklama:
- Code 2 hattı: 'sample_exception' değişkenini EXCEPTION türünde tanımlıyoruz.
- Code 3 hattı: nested_block prosedürünü tanımlıyoruz.
- Code 6 hattı: “İç içe geçmiş blok içinde” ifadesinin yazdırılması.
- Code 7 hattı: “İç içe bloktan sample_exception hatası oluşuyor” ifadesinin yazdırılması.
- Code 8 hattı: 'RAISE sample_ Exception' kullanarak istisnayı yükseltmek.
- Code 10 hattı: İç içe geçmiş bloktaki sample_exception istisnası için istisna işleyici.
- Code 11 hattı: “İç içe blokta bir istisna yakalandı. Ana bloğa yükseltiliyor” ifadesi yazdırılıyor.
- Code 12 hattı: İstisnayı ana bloğa iletmek (yaymak).
- Code 15 hattı: “Ana bloğun içinde” ifadesinin yazdırılması.
- Code 16 hattı: “İç içe blok çağrılıyor” ifadesinin yazdırılması.
- Code 17 hattı: nested_block prosedürünü çağırıyoruz.
- Code 19 hattı: Ana bloktaki sample_ Exception için istisna işleyicisi.
- Code 20 hattı: "Ana blokta istisna yakalandı" ifadesi yazdırılıyor.
İstisnada dikkat edilmesi gereken önemli noktalar
- Bir fonksiyonda, bir istisna her zaman ya bir değer döndürmeli ya da istisnayı daha ileriye taşımalıdır; aksi takdirde Oracle Çalışma zamanında 'Fonksiyon değer döndürmedi' hatası veriyor.
- İşlem kontrol beyanları Bu komut, istisna işleme bloğunun içinde verilebilir.
- SQLERRM ve SQLCODE, sırasıyla istisna mesajını ve istisna kodunu döndüren yerleşik fonksiyonlardır.
- Bir istisna ele alınmazsa, varsayılan olarak o oturumdaki tüm aktif işlemler geri alınır.
- UYGULAMA HATASI OLUŞTUR (- , (RAISE yerine, özel bir kod ve mesajla hata oluşturmak için kullanılabilir. Hata kodu -20000 ile -20999 arasında olmalıdır.)





