Oracle PL / SQL kivételkezelés: Példák a felhasználó által meghatározott kivétel növelésére

Tartalomjegyzék:

Anonim

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

Kivétel akkor fordul elő, amikor a PL / SQL motor olyan utasítással találkozik, amelyet a futás közben bekövetkező hiba miatt nem tud végrehajtani. Ezeket a hibákat az összeállítás idején nem rögzítjük, ezért csak a futás idején kellett kezelni őket.

Például, ha a PL / SQL motor utasítást kap, hogy tetszőleges számot osszon el „0” -val, akkor a PL / SQL motor kivételként dobja. A kivételt csak futás közben vetíti fel a PL / SQL motor.

A kivételek meggátolják a program további futtatását, így az ilyen állapot elkerülése érdekében külön kell rögzíteni és kezelni őket. Ezt a folyamatot Exception-Handling-nek hívják, amelyben a programozó kezeli a futáskor előforduló kivételt.

Ebben az oktatóanyagban a következő témákat ismerheti meg:

  • Kivételkezelő szintaxis
  • Kivétel típusai
  • Előre definiált kivételek
  • Felhasználó által meghatározott kivétel
  • PL / SQL kivétel emelése
  • Fontos megjegyzendő pontok a Kivétel részben

Kivételkezelő szintaxis

A kivételeket a blokk szintjén kezeljük, azaz ha valamelyik blokkban bármilyen kivétel lép fel, akkor a vezérlés a blokk végrehajtási részéből kerül ki. A kivételt ezután a blokk kivételkezelő részében kezeljük. A kivétel kezelése után nem lehet újból visszaküldeni a vezérlést az adott blokk végrehajtási szakaszába.

Az alábbi szintaxis elmagyarázza a kivétel elkapásának és kezelésének módját.

BEGIN… EXCEPTIONWHEN THENWHEN OTHERSTHENEND;

Szintaxis Magyarázat:

  • A fenti szintaxisban a kivételkezelő blokk WHEN feltételsorozatot tartalmaz a kivétel kezelésére.
  • Minden WHEN feltételt követ a kivétel neve, amely várhatóan fel fog emelkedni a futási időben.
  • Amikor futás közben bármilyen kivétel merül fel, akkor a PL / SQL motor a kivételkezelő részben keresi az adott kivételt. Ez az első „WHEN” záradéktól indul, és egymás után fog keresni.
  • Ha megtalálja a felvetett kivétel kezelését, akkor végrehajtja az adott kezelési kódot.
  • Ha a „WHEN” záradék egyike sem szerepel a felvetett kivételnél, akkor a PL / SQL motor végrehajtja a „WHEN OTHERS” részt (ha van). Ez minden kivételnél általános.
  • A kivétel végrehajtása után az alkatrészvezérlés kimegy az aktuális blokkból.
  • Csak egy kivételt lehet végrehajtani egy blokkhoz futás közben. A végrehajtás után a vezérlő kihagyja a fennmaradó kivételkezelő részt, és kimegy az aktuális blokkból.

Megjegyzés: AMIKOR MÁSOK mindig a sorozat utolsó helyén kell lenniük. A WHEN OTHERS után megjelenő kivételkezelő részt soha nem hajtják végre, mivel a vezérlés a WHEN OTHERS végrehajtása után kilép a blokkból.

Kivétel típusai

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

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

Előre definiált kivételek

Az Oracle előre definiált néhány általános kivételt. Ezeknek a kivételeknek egyedi kivételnevük és hibaszámuk van. Ezeket a kivételeket már meghatározta az Oracle 'STANDARD' csomagja. A kódban ezeket az előre definiált kivételneveket közvetlenül kezelhetjük.

Az alábbiakban néhány előre meghatározott kivétel szerepel

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 szereplő „WHEN” záradék egyikének sem felel meg, és nincs meghatározva „ELSE” záradék
COLLECTION_IS_NULL ORA-06531 Gyűjtési módszerek (az EXISTS kivételével) vagy a gyűjteményattribútumok elérése egy inicializálatlan gyűjteményen
CURSOR_ALREADY_OPEN ORA-06511 Megpróbál megnyitni egy már nyitott kurzort
DUP_VAL_ON_INDEX ORA-00001 Ismétlődő érték tárolása az adatbázis oszlopában, amelyet egyedi index korlátoz
INVALID_CURSOR ORA-01001 Az illegális kurzorműveletek, például egy nyitatlan kurzor bezárása
ÉRVÉNYTELEN SZÁM ORA-01722 A karakter számokká alakí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 keres sorokat.
ROW_MISMATCH ORA-06504 Ha a kurzor vá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 A gyűjtemény hivatkozása olyan indexszámmal, amely kívül esik a törvényes tartományon (pl .: -1)
TOO_MANY_ROWS ORA-01422 Amikor egy 'SELECT' utasítás INTO záradékkal több sort ad vissza
VALUE_ERROR ORA-06502 Számtani vagy méretkorlátozási hiba (pl .: a változó méreténél nagyobb változóhoz értéket rendelünk)
ZERO_DIVIDE ORA-01476 Szám elosztása „0” -val

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

Az Oracle-ben, a fent definiált kivételektől eltekintve, a programozó létrehozhat saját kivételt és kezelheti azokat. Alprogramszinten 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 bárhol látható, ahol a csomag elérhető. <

Szintaxis: Alprogram szintjén

DECLARE EXCEPTION;BEGINEXCEPTIONWHEN  THENEND;
  • A fenti szintaxisban a „kivétel_név” változó meghatározása „KIVÉTEL” típusú.
  • Ez hasonló módon használható előre definiált kivételként.

Szintaxis: Csomag specifikáció szinten

CREATE PACKAGE 
IS EXCEPTION;… END 
;
  • A fenti szintaxisban a „kivétel_név” változó „KIVÉTEL” típusúként definiálva van a csomag specifikációban.
  • Ez felhasználható az adatbázisban, bárhova hívható a 'package_name' csomag.

PL / SQL kivétel emelése

Az összes előre definiált kivétel implicit módon felmerül, amikor a hiba bekövetkezik. De a felhasználó által meghatározott kivételeket kifejezetten fel kell emelni. Ez a „RAISE” kulcsszóval érhető el. Ez az alábbiakban felsorolt ​​bármely módon felhasználható.

Ha a programban külön használják a „RAISE” elemet, akkor a már felvetett kivételt továbbítja a szülőblokkba. Csak kivételesen használható blokk az alábbiak szerint.

CREATE [ PROCEDURE | FUNCTION ]ASBEGINEXCEPTIONWHEN  THENRAISE;END;

Szintaxis Magyarázat:

  • A fenti szintaxisban a RAISE kulcsszót használják a kivételkezelő blokkban.
  • Amikor a program a "kivétel_név" kivétellel találkozik, a kivételt kezeljük, és a szokásos módon befejezzük
  • De a kivételkezelő részben szereplő „RAISE” kulcsszó továbbítja ezt a kivételt a szülőprogramba.

Megjegyzés: Miközben a szülőblokkra vonatkozó kivételt felemeli, a növekvő kivételnek a szülőblokknál is láthatónak kell lennie, máskülönben az oracle hibát dob.

  • Használhatjuk a 'RAISE' kulcsszót, amelyet a kivétel neve követ, az adott felhasználó által definiált / előre definiált kivétel felvetésére. Ez mind a végrehajtási részben, mind a kivételkezelő részben felhasználható a kivétel felvetésére.
CREATE [ PROCEDURE | FUNCTION ]ASBEGINRAISE EXCEPTIONWHEN  THENEND;

Szintaxis Magyarázat:

  • A fenti szintaxisban a RAISE kulcsszót használják a végrehajtási részben, amelyet a "kivétel_név" kivétel követ.
  • Ez felveti ezt a kivételt a végrehajtáskor, és ezt tovább kell kezelni vagy fel kell emelni.

1. példa : Ebben a példában megnézzük

  • Hogyan lehet kijelenteni a kivételt
  • Hogyan lehet felhozni a bejelentett kivételt és
  • Hogyan terjesszük a fő blokkba
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:/

Kód Magyarázat:

  • 2. kódsor: A „sample_exception” változó deklarálása EXCEPTION típusnak.
  • 3. kódsor: A beágyazott_blokk deklarálási eljárása.
  • 6. kódsor: Az "Inside nested block" utasítás kinyomtatása.
  • 7. kódsor: A "minta_kivétel emelése beágyazott blokkból" utasítás nyomtatása.
  • 8. kódsor : A kivétel emelése a „RAISE sample_exception” használatával.
  • 10. kódsor : Kivételkezelő a kivétel_minta kivételhez a beágyazott blokkban.
  • 11. kódsor: A 'Kivétel beágyazott blokkban elfoglalt utasítás kinyomtatása. Fő blokkra emelés ”.
  • 12. kódsor : A kivétel felemelése a fő blokkra (terjed a fő blokkra).
  • 15. kódsor: A "Belül a fő blokkban" utasítás nyomtatása.
  • 16. kódsor: A "Beágyazott blokk hívása" utasítás nyomtatása.
  • 17. kódsor : Nested_block eljárás hívása.
  • 19. kódsor : Kivételkezelő a minta_kivételhez a fő blokkban.
  • 20. kódsor : A "Kivétel rögzítve a fő blokkban" utasítás nyomtatása.

Fontos megjegyzendő pontok a Kivétel részben

  • Funkcióban egy kivételnek mindig vagy vissza kell térnie, vagy tovább kell növelnie a kivételt. különben az Oracle futás közben el fogja dobni a „Function return érték nélkül” hibát.
  • A tranzakcióvezérlő utasításokat a kivételkezelő blokkban lehet megadni.
  • Az SQLERRM és az SQLCODE a beépített függvények, amelyek megadják a kivétel üzenetet és kódot.
  • Ha egy kivételt nem kezelnek, akkor alapértelmezés szerint az adott munkamenet összes aktív tranzakciója visszaáll.
  • A RAISE_APPLICATION_ERROR (- , ) felhasználható a RAISE helyett a hiba feltüntetésére felhasználói kóddal és üzenettel. A hibakódnak nagyobbnak kell lennie, mint 20000, és előtagja: -.

Összegzés

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

  • A kivételek kezelése
  • Definiáljon kivételt
  • Emelje fel a kivételt
  • Kivétel terjedése