İstisna İşleme Oracle PL/SQL (Örnekler)

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ı gerekiyordu.

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

İstisnalar programın daha fazla çalışmasını durduracaktır; bu nedenle, bu tür bir durumdan kaçınmak için bunların ayrı ayrı yakalanıp işlenmesi gerekir. Bu işleme, programcının çalışma zamanında oluşabilecek istisnayı ele aldığı İstisna İşleme adı verilir.

İ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 çıkar. İstisna daha sonra o bloğun istisna işleme kısmında ele alınacaktır. İstisnayı ele aldıktan sonra kontrolü o bloğun yürütme bölümüne yeniden göndermek mümkün değildir.

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

PL/SQL'de İstisna İşleme

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, 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 özel durum adı gelir.
  • Çalışma zamanında herhangi bir istisna ortaya çıktığında, PL/SQL motoru bu özel istisna için istisna işleme kısmına bakacaktır. İlk 'WHEN' cümlesinden başlayacak ve sırayla arama yapacaktır.
  • Ortaya çıkan istisna için istisna işlemeyi bulursa, söz konusu işleme kodu bölümünü yürütecektir.
  • Ortaya çıkan istisna için 'WHEN' yan tümcesinden hiçbiri mevcut değilse, PL/SQL motoru 'WHEN OTHERS' bölümünü (varsa) çalıştıracaktır. Bu, tüm istisnalar için ortaktır.
  • İstisna yürütüldükten 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 denetleyici kalan istisna işleme bölümünü atlayacak ve geçerli bloğun dışına çıkacaktır.

Not: WHEN DİĞERLERİ her zaman dizinin son konumunda olmalıdır. WHEN OTHERS'tan sonra mevcut olan istisna işleme kısmı hiçbir zaman yürütülmeyecektir, çünkü kontrol WHEN OTHERS'ı yürüttükten sonra bloktan çıkacaktır.

İstisna Türleri

İki tür İstisna vardır Pl/SQL.

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

Önceden Tanımlanmış İstisnalar

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

Aşağıda önceden tanımlanmış birkaç istisna verilmiştir

Istisna 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' yan tümcesinin hiçbiri karşılanmadı ve hiçbir 'ELSE' yan tümcesi belirtilmedi
COLLECTION_IS_NULL ORA-06531 Koleksiyon yöntemlerini kullanma (EXISTS hariç) veya başlatılmamış koleksiyonlardaki koleksiyon niteliklerine erişme
CURSOR_ALREADY_OPEN ORA-06511 Bir açmaya çalışıyorum imleç zaten açılmış olan
DUP_VAL_ON_INDEX ORA-00001 Benzersiz bir dizin tarafından kısıtlanan bir veritabanı sütununda yinelenen bir değerin saklanması
INVALID_CURSOR ORA-01001 Açılmamış bir imleci kapatmak gibi yasa dışı 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ümcesini içeren 'SELECT' ifadesi hiçbir satır getirmediğinde.
ROW_MISMATCH ORA-06504 İmleç değişkeni veri türü gerçek imleç dönüş türüyle uyumsuz olduğunda
SUBSCRIPT_BEYOND_COUNT ORA-06533 Koleksiyonun boyutundan daha büyük bir dizin numarasına göre koleksiyona atıfta bulunulması
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Yasal aralığın dışındaki bir dizin numarasına göre toplamaya atıfta bulunulması (örneğin: -1)
TOO_MANY_ROWS ORA-01422 INTO yan tümcesi içeren 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 değer atamak)
ZERO_DIVIDE ORA-01476 Bir sayıyı '0'a bölmek

Kullanıcı Tanımlı İstisna

In OracleYukarıda önceden tanımlanan istisnaların dışında, programcı kendi istisnasını oluşturabilir ve bunları yönetebilir. Bildirim kısmında alt program düzeyinde oluşturulabilirler. Bu istisnalar yalnızca o alt programda görülebilir. Paket spesifikasyonunda tanımlanan istisna, genel 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 'istisna_adı' değişkeni 'EXCEPTION' türü olarak tanımlanır.
  • Bu, önceden tanımlanmış bir istisnaya benzer şekilde kullanılabilir.

Sözdizimi:Paket Spesifikasyonu düzeyinde

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • Yukarıdaki sözdiziminde 'istisna_adı' değişkeni, paket spesifikasyonunda 'EXCEPTION' türü olarak tanımlanır. .
  • Bu, veritabanında 'paket_adı' paketinin çağrılabileceği her yerde kullanılabilir.

PL/SQL Yükseltme İstisnası

Hata oluştuğunda önceden tanımlanmış tüm istisnalar örtülü olarak ortaya çıkar. Ancak kullanıcı tanımlı istisnaların açıkça belirtilmesi gerekir. Bu, 'YÜKSELTME' anahtar kelimesi kullanılarak başarılabilir. Bu, aşağıda belirtilen yollardan herhangi birinde kullanılabilir.

Eğer 'RAISE' programda ayrı olarak kullanılırsa, halihazırda ortaya çıkan istisnayı ana bloğa yayacaktır. Aşağıda gösterildiği gibi yalnızca istisna bloğunda kullanılabilir.

PL/SQL Yükseltme İstisnası

CREATE [ PROCEDURE | FUNCTION ]
 AS
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
             <Handler>
RAISE;
END;

Sözdizimi Açıklaması:

  • Yukarıdaki sözdiziminde, istisna işleme bloğunda RAISE anahtar sözcüğü kullanılır.
  • Program "istisna_adı" istisnasıyla karşılaştığında, istisna işlenir ve normal şekilde tamamlanır
  • Ancak istisna işleme kısmındaki 'RAISE' anahtar kelimesi bu özel istisnayı ana programa yayacaktır.

Not: İstisnayı ana bloğa yükseltirken, ortaya çıkan istisnanın da ana blokta görünmesi gerekir, aksi takdirde Oracle bir hata verecektir.

  • Söz konusu 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 bölümünde hem de istisna işleme bölümünde kullanılabilir.

PL/SQL Yükseltme İstisnası

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 kısmında RAISE anahtar sözcüğü ve ardından "istisna_adı" istisnası kullanılır.
  • Bu, uygulama sırasında bu özel istisnayı gündeme getirecektir ve bunun daha fazla ele alınması veya gündeme getirilmesi gerekmektedir.

Örnek 1: Bu örnekte şunu göreceğiz:

  • İstisna nasıl ilan edilir
  • Bildirilen istisnanın nasıl yükseltileceği ve
  • Ana bloğa nasıl yayılır

PL/SQL Yükseltme İstisnası

PL/SQL Yükseltme İstisnası

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:
/

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ün bildirilmesi.
  • Kod satırı 6: “İç içe geçmiş blok” ifadesinin yazdırılması.
  • Kod satırı 7: "Örnek_istisnayı yuvalanmış bloktan yükseltmek" ifadesini yazdırmak.
  • Kod satırı 8: 'RAISE sample_ Exception' kullanarak istisnayı yükseltmek.
  • Kod satırı 10: İç içe bloktaki istisna sample_istisnası için istisna işleyicisi.
  • Kod satırı 11: 'Yuvalanmış blokta istisna yakalandı' ifadesinin yazdırılması. Ana bloğa yükseltiliyor'.
  • Kod satırı 12: İstisnanın ana bloğa yükseltilmesi (ana bloğa yayılması).
  • Kod satırı 15: “Ana bloğun içinde” ifadesinin yazdırılması.
  • Kod satırı 16: “İç içe blok çağrılıyor” ifadesinin yazdırılması.
  • Kod satırı 17: Nested_block prosedürünün çağrılması.
  • Kod satırı 18: Istisna
  • 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 edilmesi gereken önemli noktalar

  • Fonksiyonda bir istisna her zaman ya değer döndürmeli ya da istisnayı daha da yükseltmelidir. başka Oracle çalışma zamanında 'İşlev değer olmadan döndürüldü' hatası verecektir.
  • İstisna işleme bloğunda işlem kontrol ifadeleri verilebilmektedir.
  • SQLERRM ve SQLCODE, istisna mesajını ve kodunu verecek yerleşik işlevlerdir.
  • Bir istisna işlenmezse, varsayılan olarak o oturumdaki tüm etkin işlemler geri alınacaktır.
  • RAISE_APPLICATION_ERROR (- , Hatayı kullanıcı kodu ve mesajla yükseltmek için RAISE yerine ) kullanılabilir. Hata kodu 20000'den büyük olmalı ve önüne '-' eklenmelidir.

ÖZET

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

  • İstisnaları ele alma
  • Bir istisna tanımlayın
  • İstisnayı yükselt
  • İstisna yayılımı