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 THEN WHEN OTHERSTHEN 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 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.
- Önceden Tanımlanmış İstisnalar
- 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
DECLAREEXCEPTION;BEGIN EXCEPTIONWHEN THEN END;
- 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 PACKAGEIS 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 THEN RAISE;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 THEN END;
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ı