Kivételek kezelése Oracle PL/SQL (példák)

Mi az a kivételkezelés a PL/SQL-ben?

Kivétel akkor történik, amikor a PL/SQL motor olyan utasítással találkozik, amelyet nem tud végrehajtani egy futás közben fellépő hiba miatt. Ezeket a hibákat a rendszer nem rögzíti a fordításkor, ezért ezeket csak a futási időben kell kezelni.

Például, ha a PL/SQL motor utasítást kap bármely szám 0-val való elosztására, akkor a PL/SQL motor kivételként dobja ki. A kivételt a PL/SQL motor csak futási időben veti fel.

A kivételek leállítják a program további végrehajtását, ezért az ilyen állapot elkerülése érdekében ezeket külön kell rögzíteni és kezelni. Ezt a folyamatot kivételkezelésnek nevezik, amelyben a programozó kezeli a futási időben előforduló kivételeket.

Kivételkezelési szintaxis

A kivételek kezelése a blokk szintjén történik, azaz ha bármely blokkban kivétel történik, akkor a vezérlés kikerül a blokk végrehajtási részéből. A kivételt ezután az adott blokk kivételkezelő részében kezeli a rendszer. A kivétel kezelése után nem lehet visszaküldeni a vezérlést az adott blokk végrehajtási szakaszába.

Az alábbi szintaxis elmagyarázza, hogyan lehet elkapni és kezelni a kivételt.

Kivételkezelés PL/SQL-ben

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;

Szintaxis magyarázata:

  • A fenti szintaxisban a kivételkezelő blokk WHEN feltétel sorozatot tartalmaz a kivétel kezelésére.
  • Minden WHEN feltételt a kivétel neve követ, amely várhatóan fel fog emelkedni a futási időben.
  • Ha futás közben bármilyen kivétel felmerül, akkor a PL/SQL motor a kivételkezelő részben keresi az adott kivételt. Az első „WHEN” záradéktól indul, és szekvenciálisan keresni fog.
  • Ha megtalálta a kivétel kezelését a felhozott kivételhez, akkor végrehajtja az adott kezelési kódrészt.
  • Ha a „WHEN” záradék egyike sem szerepel a felhozott kivételnél, akkor a PL/SQL motor végrehajtja a „WHEN OTHERS” részt (ha van). Ez minden kivételre jellemző.
  • A kivétel végrehajtása után az alkatrészvezérlés kikerül az aktuális blokkból.
  • Egy blokkhoz csak egy kivételrész hajtható végre futásidőben. A végrehajtás után a vezérlő kihagyja a fennmaradó kivételkezelési részt, és kilép az aktuális blokkból.

Jegyzet: A WHEN OTHERS-nek mindig a sorozat utolsó helyén kell lennie. A WHEN OTHERS után található kivételkezelő rész soha nem kerül végrehajtásra, mivel a vezérlő kilép a blokkból a WHEN OTHERS végrehajtása után.

A kivételek típusai

Kétféle kivétel létezik Pl/SQL.

  1. Előre meghatározott kivételek
  2. Felhasználó által meghatározott kivétel

Előre meghatározott kivételek

Oracle előre meghatározott néhány gyakori kivételt. Ezek a kivételek egyedi kivételnévvel és hibaszámmal rendelkeznek. Ezek a kivételek már meghatározva vannak a „STANDARD” csomagban Oracle. A kódban közvetlenül használhatjuk ezeket az előre meghatározott kivételneveket a kezelésükhöz.

Az alábbiakban felsoroljuk a néhány előre meghatározott kivételt

kivétel Hibakód Kivétel oka
ACCESS_INTO_NULL ORA-06530 Rendeljen értéket az inicializálatlan objektumok attribútumaihoz
CASE_NOT_FOUND ORA-06592 A CASE utasításban a WHEN záradék egyike sem teljesül, és nincs megadva az ELSE záradék sem
COLLECTION_IS_NULL ORA-06531 Gyűjteményi módszerek használata (kivéve EXISTS) vagy gyűjteményattribútumok elérése inicializálatlan gyűjteményekben
CURSOR_ALREADY_OPEN ORA-06511 Megpróbálja megnyitni a kurzor amely már nyitva van
DUP_VAL_ON_INDEX ORA-00001 Ismétlődő érték tárolása egy egyedi index által korlátozott adatbázisoszlopban
INVALID_CURSOR ORA-01001 Illegális kurzorműveletek, mint például a megnyitatlan kurzor bezárása
ÉRVÉNYTELEN SZÁM ORA-01722 A karakter számmá átalakítása érvénytelen számkarakter miatt nem sikerült
NEM TALÁLHATÓ ADAT ORA-01403 Amikor az INTO záradékot tartalmazó "SELECT" utasítás nem kér le sorokat.
ROW_MISMATCH ORA-06504 Ha a kurzorváltozó adattípusa nem kompatibilis a kurzor tényleges visszatérési típusával
SUBSCRIPT_BEYOND_COUNT ORA-06533 Gyűjtemény hivatkozása a gyűjtemény méreténél nagyobb indexszámmal
SUBSCRIPT_OUTSIDE_LIMIT ORA-06532 Gyűjtemény olyan indexszámmal történő hivatkozása, amely kívül esik a törvényes tartományon (pl.: -1)
TOO_MANY_ROWS ORA-01422 Amikor egy INTO záradékkal rendelkező 'SELECT' utasítás egynél több sort ad vissza
VALUE_ERROR ORA-06502 Aritmetikai vagy méretkorlátozási hiba (pl.: érték hozzárendelése egy olyan változóhoz, amely nagyobb, mint a változó mérete)
ZERO_DIVIDE ORA-01476 egy szám elosztása "0"-val

Felhasználó által meghatározott kivétel

In Oracle, a fent előre meghatározott kivételektől eltekintve a programozó létrehozhat saját kivételt és kezelheti azokat. Alprogram szinten hozhatók létre a deklarációs részben. Ezek a kivételek csak abban az alprogramban láthatók. A csomagspecifikációban meghatározott kivétel nyilvános kivétel, és mindenhol látható, ahol a csomag elérhető.

Syntax: Alprogram szinten

DECLARE
<exception_name> EXCEPTION; 
BEGIN
<Execution block>
EXCEPTION
WHEN <exception_name> THEN 
<Handler>
END;
  • A fenti szintaxisban a „kivétel_neve” változó „EXCEPTION” típusúként van definiálva.
  • Ez hasonló módon használható előre meghatározott kivételként.

Syntax:Csomag specifikáció szinten

CREATE PACKAGE <package_name>
 IS
<exception_name> EXCEPTION;
.
.
END <package_name>;
  • A fenti szintaxisban az 'exception_name' változó 'EXCEPTION' típusként van definiálva a csomag specifikációjában. .
  • Ez mindenhol használható az adatbázisban, ahol a 'package_name' csomag meghívható.

PL/SQL emelés kivétel

Az összes előre meghatározott kivétel implicit módon megjelenik a hiba előfordulásakor. De a felhasználó által meghatározott kivételeket kifejezetten fel kell vetni. Ez a „RAISE” kulcsszó használatával érhető el. Ez az alábbiakban felsorolt ​​​​módok bármelyikével használható.

Ha a 'RAISE'-t külön használjuk a programban, akkor a már felvetett kivételt továbbítja a szülőblokknak. Csak kivételblokkban használható az alábbiak szerint.

PL/SQL emelés kivétel

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

Szintaxis magyarázata:

  • A fenti szintaxisban a RAISE kulcsszót használjuk a kivételkezelő blokkban.
  • Amikor a program „kivétel_neve” kivétellel találkozik, a kivétel kezelve lesz, és a szokásos módon befejeződik
  • De a kivételkezelő részben a „RAISE” kulcsszó ezt a kivételt továbbítja a szülőprogramnak.

Jegyzet: Miközben a kivételt a szülőblokkra emeli, a felvett kivételnek a szülőblokknál is láthatónak kell lennie, különben az oracle hibát dob.

  • A 'RAISE' kulcsszót és a kivétel nevét használhatjuk az adott felhasználó által meghatározott/előre definiált kivétel felemelésére. Ez mind a végrehajtási részben, mind a kivételkezelési részben használható a kivétel előidézésére.

PL/SQL emelés kivétel

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

Szintaxis magyarázata:

  • A fenti szintaxisban a RAISE kulcsszó kerül felhasználásra a végrehajtási részben, amelyet a „kivétel_neve” kivétel követ.
  • Ez a végrehajtás során felveti ezt a kivételt, és ezt kezelni vagy tovább kell emelni.

Példa 1: Ebben a példában látni fogjuk

  • Hogyan jelentsük ki a kivételt
  • Hogyan emeljük fel a bejelentett kivételt és
  • Hogyan terjesztjük a főblokkba

PL/SQL emelés kivétel

PL/SQL emelés kivétel

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

Kód magyarázata:

  • 2. kódsor: A 'sample_exception' változó KIVÉTEL típusú deklarálása.
  • 3. kódsor: Nesd_block eljárás deklarálása.
  • 6. kódsor: A „Beágyazott blokkon belül” utasítás kinyomtatása.
  • 7. kódsor: A „Minta_kivétel kiemelése beágyazott blokkból” utasítás kinyomtatása.
  • 8. kódsor: A kivétel emelése a 'RAISE sample_exception' használatával.
  • 10. kódsor: Kivételkezelő a minta_exception kivételhez a beágyazott blokkban.
  • 11. kódsor: A „Kivétel rögzítve a beágyazott blokkban” utasítás kinyomtatása. Felemelés a főblokkba'.
  • 12. kódsor: A kivétel felemelése főblokkra (a főblokkra terjedése).
  • 15. kódsor: A „Főblokk belsejében” utasítás kinyomtatása.
  • 16. kódsor: A „Beágyazott blokk hívása” utasítás kinyomtatása.
  • 17. kódsor: Nesd_block eljárás meghívása.
  • 18. kódsor: kivétel
  • 19. kódsor: A minta_exception kivételkezelője a fő blokkban.
  • 20. kódsor: A „Kivétel rögzítve a fő blokkban” utasítás kinyomtatása.

Fontos tudnivalók a Kivételnél

  • A függvényben a kivételnek mindig vagy értéket kell visszaadnia, vagy tovább kell emelnie a kivételt. más Oracle "A függvény érték nélkül visszaadott" hibát fog dobni futás közben.
  • Tranzakcióvezérlő utasítások adhatók meg a kivételkezelő blokkban.
  • Az SQLERRM és az SQLCODE azok a beépített függvények, amelyek kivételüzenetet és kódot adnak.
  • Ha egy kivételt nem kezelnek, akkor alapértelmezés szerint az adott munkamenetben lévő összes aktív tranzakció visszaállításra kerül.
  • RAISE_APPLICATION_ERROR (- , ) használható a RAISE helyett a hiba előidézésére felhasználói kóddal és üzenettel. A hibakódnak nagyobbnak kell lennie 20000-nél, és előtaggal kell rendelkeznie "-".

Összegzésként

E fejezet után. képesnek kell lennie arra, hogy a Pl. következő szempontjaiért dolgozzon SQL kivételek

  • A kivételek kezelése
  • Határozzon meg egy kivételt
  • Emelje fel a kivételt
  • Kivétel terjesztés