Oracle PL / SQL İstisna İşleme: Kullanıcı Tanımlı İstisnayı Yükseltme Örnekleri

İçindekiler:

Anonim

PL / SQL'de İstisna İşleme nedir?

PL / SQL motoru, çalışma zamanında oluşan bir hata nedeniyle yürütemediği bir talimatla karşılaştığında bir istisna oluşur. Bu hatalar derleme sırasında yakalanmayacaktır ve bu nedenle bunların yalnızca çalışma zamanında ele alınması gerekir.

Örneğin, PL / SQL motoru herhangi bir sayıyı '0'a bölme talimatı alırsa, PL / SQL motoru bunu bir istisna olarak atar. İstisna, yalnızca PL / SQL motoru tarafından çalışma zamanında ortaya çıkar.

İstisnalar, programın daha fazla çalışmasını durduracaktır, bu nedenle bu tür durumlardan kaçınmak için ayrı ayrı yakalanmaları ve ele alınmaları gerekir. Bu işlem, programcının çalışma zamanında oluşabilecek istisnayı işlediği İstisna İşleme olarak adlandırılır.

Bu eğitimde aşağıdaki konuları öğreneceksiniz:

  • İstisna İşleme Sözdizimi
  • İstisna Türleri
  • Önceden Tanımlanmış İstisnalar
  • Kullanıcı Tanımlı İstisna
  • PL / SQL Yükseltme İstisnası
  • İstisnada dikkat edilecek önemli noktalar

İstisna İşleme Sözdizimi

İstisnalar blok seviyesinde ele alınır, yani herhangi bir blokta herhangi bir istisna meydana gelirse, kontrol o bloğun yürütme kısmından çıkacaktır. İstisna, daha sonra bu bloğun istisna işleme kısmında ele alınacaktır. İstisnayı ele aldıktan sonra, kontrolü bu bloğun yürütme bölümüne geri göndermek mümkün değildir.

Aşağıdaki sözdizimi, istisnanın nasıl yakalanacağını ve ele alınacağını açıklamaktadır.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Sözdizimi Açıklaması:

  • Yukarıdaki sözdiziminde, istisna işleme bloğu, istisnayı işlemek için bir dizi WHEN koşulu içerir.
  • Her WHEN koşulunun ardından, çalışma zamanında ortaya çıkması beklenen istisna adı gelir.
  • Çalışma zamanında herhangi bir istisna ortaya çıktığında, PL / SQL motoru o özel istisna için istisna işleme kısmına bakacaktır. İlk 'WHEN' cümlesinden başlayacak ve sırayla arayacaktır.
  • Oluşturulan istisna için istisna işlemeyi bulursa, o belirli işleme kodu bölümünü çalıştıracaktır.
  • Ortaya çıkan istisna için 'WHEN' cümlesinden hiçbiri yoksa, PL / SQL motoru 'WHEN OTHERS' bölümünü (varsa) çalıştıracaktır. Bu, tüm istisnalar için ortaktır.
  • İstisnayı uyguladıktan sonra, parça kontrolü mevcut bloğun dışına çıkacaktır.
  • Çalışma zamanında bir blok için yalnızca bir istisna parçası yürütülebilir. Çalıştırdıktan sonra, kontrol cihazı kalan istisna işleme bölümünü atlayacak ve mevcut bloktan çıkacaktır.

Not: NE ZAMAN DİĞERLERİ her zaman dizinin son konumunda olmalıdır. WHEN OTHERS'den sonra mevcut olan istisna işleme parçası, kontrol WHEN OTHERS'i çalıştırdıktan sonra bloktan çıkacağı için asla yürütülmeyecektir.

İstisna Türleri

Pl / SQL'de iki tür İstisna vardır.

  1. Önceden Tanımlanmış İstisnalar
  2. Kullanıcı Tanımlı İstisna

Önceden Tanımlanmış İstisnalar

Oracle bazı genel istisnaları önceden tanımlamıştır. Bu istisnaların benzersiz bir istisna adı ve hata numarası vardır. Bu istisnalar, Oracle'daki 'STANDART' paketinde zaten tanımlanmıştır. Kodda, bu önceden tanımlanmış istisna isimlerini doğrudan işlemek için kullanabiliriz.

Aşağıda önceden tanımlanmış birkaç istisna bulunmaktadır

İstisna Hata kodu İstisna Nedeni
ACCESS_INTO_NULL ORA-06530 Başlatılmamış nesnelerin niteliklerine bir değer atayın
CASE_NOT_FOUND ORA-06592 CASE ifadesindeki 'WHEN' maddesinin hiçbiri karşılanmadı ve 'ELSE' yan tümcesi belirtilmedi
COLLECTION_IS_NULL ORA-06531 Toplama yöntemlerini kullanma (EXISTS hariç) veya başlatılmamış koleksiyonlardaki koleksiyon özniteliklerine erişme
CURSOR_ALREADY_OPEN ORA-06511 Zaten açık olan bir imleci açmaya çalışıyorum
DUP_VAL_ON_INDEX ORA-00001 Benzersiz bir dizin tarafından kısıtlanmış bir veritabanı sütununda yinelenen bir değer saklama
INVALID_CURSOR ORA-01001 Açılmamış bir imleci kapatmak gibi yasadışı imleç işlemleri
GEÇERSİZ NUMARA ORA-01722 Geçersiz sayı karakteri nedeniyle karakterin sayıya dönüştürülmesi başarısız oldu
VERİ BULUNAMADI ORA-01403 INTO yan tümcesi içeren 'SELECT' ifadesi satır getirmediğinde.
ROW_MISMATCH ORA-06504 İmleç değişkeni veri türü, gerçek imleç dönüş türü ile uyumsuz olduğunda
SUBSCRIPT_BEYOND_COUNT ORA-06533 Koleksiyona, koleksiyon boyutundan daha büyük bir dizin numarasıyla başvurma
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Koleksiyona yasal aralığın dışındaki bir dizin numarasıyla başvurma (örneğin: -1)
TOO_MANY_ROWS ORA-01422 INTO yan tümcesine sahip bir 'SELECT' ifadesi birden fazla satır döndürdüğünde
VALUE_ERROR ORA-06502 Aritmetik veya boyut kısıtlaması hatası (örneğin: değişken boyutundan daha büyük bir değişkene bir değer atama)
ZERO_DIVIDE ORA-01476 Bir sayının '0'a bölünmesi

Kullanıcı Tanımlı İstisna

Oracle'da, önceden tanımlanmış istisnalar dışında, programcı kendi istisnasını yaratabilir ve bunları idare edebilir. Beyan bölümünde bir alt program seviyesinde oluşturulabilirler. Bu istisnalar yalnızca o alt programda görülebilir. Paket spesifikasyonunda tanımlanan istisna, genel istisnadır ve paketin erişilebilir olduğu her yerde görülebilir. <

Sözdizimi: Alt program düzeyinde

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • Yukarıdaki sözdiziminde, 'istisna_adı' değişkeni 'EXCEPTION' tipi olarak tanımlanmıştır.
  • Bu, önceden tanımlanmış bir istisna olarak benzer şekilde kullanılabilir.

Sözdizimi: Paket Belirtimi düzeyinde

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • Yukarıdaki sözdiziminde, 'istisna_adı' değişkeni, paket belirtiminde 'EXCEPTION' türü olarak tanımlanmıştır.
  • Bu, veritabanında 'paket_adı' paketinin çağrılabildiği her yerde kullanılabilir.

PL / SQL Yükseltme İstisnası

Önceden tanımlanmış tüm istisnalar, hata meydana geldiğinde örtük olarak ortaya çıkar. Ancak kullanıcı tanımlı istisnaların açıkça ortaya konması gerekir. Bu, 'RAISE' anahtar kelimesi kullanılarak elde edilebilir. Bu, aşağıda belirtilen yollardan herhangi biri ile kullanılabilir.

Programda 'RAISE' ayrı olarak kullanılırsa, o zaman zaten yükseltilmiş istisnayı ana bloğa yayacaktır. Yalnızca istisna halinde blok aşağıda gösterildiği gibi kullanılabilir.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Sözdizimi Açıklaması:

  • Yukarıdaki sözdiziminde, RAISE anahtar sözcüğü istisna işleme bloğunda kullanılır.
  • Program "istisna_adı" istisnası ile karşılaştığında, istisna ele alınır ve normal şekilde tamamlanır.
  • Ancak istisna işleme bölümündeki 'RAISE' anahtar kelimesi, bu özel istisnayı ana programa yayacaktır.

Not: İstisnayı ana bloğa yükseltirken, ortaya çıkan istisna ebeveyn blokta da görünür olmalıdır, aksi takdirde oracle bir hata verir.

  • Bu belirli kullanıcı tanımlı / önceden tanımlanmış istisnayı yükseltmek için 'RAISE' anahtar kelimesini ve ardından istisna adını kullanabiliriz. Bu, istisnayı ortaya çıkarmak için hem yürütme kısmında hem de istisna işleme kısmında kullanılabilir.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Sözdizimi Açıklaması:

  • Yukarıdaki sözdiziminde, RAISE anahtar sözcüğü yürütme bölümünde kullanılır ve bunu "istisna_adı" istisnası izler.
  • Bu, yürütme sırasında bu özel istisnayı ortaya çıkaracaktır ve bunun daha fazla ele alınması veya düzeltilmesi gerekir.

Örnek 1 : Bu örnekte, göreceğiz

  • İstisna nasıl beyan edilir
  • Beyan edilen istisna nasıl yükseltilir ve
  • Ana bloğa nasıl yayılır
DECLARESample_exception EXCEPTION;PROCEDURE nested_blockISBEGINDbms_output.put_line(‘Inside nested block’);Dbms_output.put_line(‘Raising sample_exception from nested block’);RAISE sample_exception;EXCEPTIONWHEN sample_exception THENDbms_output.put_line (‘Exception captured in nested block. Raising to main block’);RAISE,END;BEGINDbms_output.put_line(‘Inside main block’);Dbms_output.put_line(‘Calling nested block’);Nested_block;EXCEPTIONWHEN sample_exception THEN Dbms_output.put_line (‘Exception captured in main block');END:/

Kod Açıklaması:

  • Kod satırı 2 : 'sample_exception' değişkeninin EXCEPTION türü olarak bildirilmesi.
  • Kod satırı 3 : nested_block prosedürünü bildirme.
  • Kod satırı 6 : "İç içe geçmiş bloğun içinde" ifadesinin yazdırılması.
  • Kod satırı 7: "İç içe bloktan sample_exception yükseltiliyor" ifadesinin yazdırılması.
  • Kod satırı 8: 'RAISE sample_exception' kullanarak istisnayı yükseltme.
  • Kod satırı 10: İç içe geçmiş bloktaki istisna sample_exception için istisna işleyicisi.
  • Kod satırı 11: 'İç içe blokta yakalanan istisna' ifadesinin yazdırılması. Ana bloğa yükseltiliyor '.
  • Kod satırı 12: İstisnayı ana bloğa yükseltme (ana bloğa ilerleme).
  • Kod satırı 15: "Ana bloğun içinde" ifadesinin yazdırılması.
  • Kod satırı 16: "İç içe blok çağrısı" ifadesinin yazdırılması.
  • Kod satırı 17: nested_block prosedürünün çağrılması.
  • Kod satırı 19: Ana bloktaki sample_exception için istisna işleyicisi.
  • Kod satırı 20: "Ana blokta yakalanan istisna" ifadesinin yazdırılması.

İstisnada dikkat edilecek önemli noktalar

  • İşlevde, bir istisna her zaman değer döndürmeli veya istisnayı daha da artırmalıdır. aksi takdirde Oracle, çalışma zamanında 'İşlev bir değer olmadan döndürüldü' hatası atar.
  • İşlem kontrol ifadeleri istisna işleme bloğunda verilebilir.
  • SQLERRM ve SQLCODE, istisna mesajını ve kodunu verecek yerleşik işlevlerdir.
  • Bir istisna işlenmezse, varsayılan olarak o oturumdaki tüm aktif işlemler geri alınır.
  • RAISE_APPLICATION_ERROR (- , ), kullanıcı kodu ve mesajla hatayı artırmak için RAISE yerine kullanılabilir. Hata kodu 20000'den büyük olmalı ve önünde '-' olmalıdır.

Özet

Bu bölümden sonra. Pl SQL istisnalarının aşağıdaki yönleri için çalışabilmelisiniz

  • İstisnaların ele alınması
  • Bir istisna tanımlayın
  • İstisnayı artırın
  • İstisna yayılımı