İ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.

  • ⚙️ Çalışma zamanı hataları: PL/SQL motoru, sıfıra bölme gibi yürütemeyeceği bir komutla karşılaştığında bir istisna ortaya çıkar.
  • 🧱 Blok yapısı: İstisnalar, WHEN yan tümceleri kullanılarak EXCEPTION bölümünde ele alınır ve WHEN OTHERS her zaman en sona yerleştirilir.
  • 📚 Önceden tanımlanmış istisnalar: Oracle STANDARD paketinde NO_DATA_FOUND ve ZERO_DIVIDE gibi sık karşılaşılan hataların adlarını içerir ve doğrudan yakalanmaya hazırdır.
  • Kullanıcı tanımlı istisnalar: Programcılar kendi EXCEPTION değişkenlerini tanımlar ve RAISE anahtar kelimesiyle bunları açıkça ortaya çıkarırlar.
  • ⬆️ Yayılma: Ele alınmayan bir istisna, kapsayıcı bloğa iletilir ve RAISE bunu üst programa yeniden bildirir.
  • 🤖 Yapay zeka yardımı: Yapay zeka kodlama araçları, inceleme sırasında istisna blokları oluşturur ve ele alınmayan hata yollarını işaretler.

İstisna İşleme Oracle PL / SQL

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:

Yürütme ve istisna bölümlerini içeren bir PL/SQL bloğunun yapısı

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:

RAISE komutuyla bir istisnayı üst bloğa iletmek

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:

RAISE komutuyla ve ardından istisna adıyla belirli bir isimli istisna fırlatma.

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:

İç içe blok içinde kullanıcı tanımlı bir istisnayı bildirme ve fırlatma örneği içeren PL/SQL kodu.

Aşağıdaki ekran görüntüsü, ana bloğun yayılan istisnayı nihayet yakaladığı aynı örneğin devamını göstermektedir:

Önce iç içe geçmiş blokta, ardından ana blokta yakalanan istisnayı gösteren çıktı.

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.)

SSS

PRAGMA EXCEPTION_INIT, kullanıcı tarafından tanımlanan bir istisna adını belirli bir istisna ile ilişkilendirir. Oracle Hata numarası. Bağlama işleminden sonra, WHEN OTHERS kullanmak ve SQLCODE'u kontrol etmek yerine, WHEN yan tümcesinde bu ORA hatasını adıyla yakalayabilirsiniz.

SQLCODE, geçerli istisnanın sayısal hata kodunu döndürürken, SQLERRM ise metin mesajını döndürür. Her ikisi de, genellikle WHEN OTHERS bloğunda olmak üzere, bir istisna işleyici içinde, neyin yanlış gittiğini kaydetmek veya görüntülemek için çağrılır.

Her hatayı sessizce yutan bir WHEN OTHERS yapısından kaçının. SQLCODE ve SQLERRM'i kaydetmeden veya RAISE ile yeniden fırlatmadan, hataları gizler. Bunu yalnızca istisnayı kaydetmek, temizlemek ve ardından yaymak için kullanın.

RAISE_APPLICATION_ERROR, -20000 ile -20999 arasında bir hata numarası ve 2048 bayta kadar bir mesaj kabul eder. Uygulamanın çalışmasını durdurur ve çağıran uygulamaya özel bir hata döndürür; böylece kullanıcı tanımlı bir durum yerel bir hata gibi görünür. Oracle hata.

Aynı blok içinde değil — kontrol EXCEPTION bölümüne geçtiğinde, o blok sona erer. Devam etmek için, riskli ifadeyi iç içe bir BEGIN…EXCEPTION…END bloğuna sarın; hata işlendikten sonra, dış blok çalışmaya devam eder.

Hata, kodda çalışma zamanı veya derleme sırasında ortaya çıkan herhangi bir sorundur. İstisna ise, çalışma zamanı hatasını temsil eden ve kontrolü EXCEPTION bölümüne aktararak programın aniden sonlanması yerine yanıt vermesini sağlayan PL/SQL çalışma zamanı mekanizmasıdır.

Evet. Yapay zeka asistanları ve makine öğrenimi tabanlı kod inceleyicileri EXCEPTION bloklarını taslak haline getirir, hangi önceden tanımlanmış istisnaların yakalanacağını önerir ve işleyici içermeyen kod yollarını işaretler. Geliştirici, dağıtımdan önce yine de mantığı ve hata mesajlarını doğrulamalıdır.

GitHub Yardımcı Pilotu Kısa bir yorumla amacı açıklayarak WHEN koşullarını, RAISE_APPLICATION_ERROR çağrılarını ve tam EXCEPTION bloklarını otomatik olarak tamamlar. Rutin işleyici kodlamasını hızlandırır, ancak oluşturulan hata kodları ve mesajlarının doğruluğu için incelenmesi gerekir.

Bu yazıyı şu şekilde özetleyin: