sql >> Databáze >  >> RDS >> Database

Naučte se, jak zacházet s výjimkami v PL/SQL

Pokud jste programátor, možná znáte koncept zpracování výjimek, který je nedílnou součástí každého programovacího jazyka. Protože chyby jsou nevyhnutelné a i ti nejchytřejší z nás se mohou při psaní kódu mýlit, musíme být seznámeni s tím, jak s nimi zacházet. V tomto článku se budeme učit zejména o zpracování výjimek v PL/SQL.

Níže jsou uvedena témata obsažená v tomto článku:

  • Co je to výjimka?
  • Syntaxe zpracování výjimek
  • Typy výjimek
    • Definováno systémem
      • Pojmenované systémové výjimky
      • Nepojmenované systémové výjimky
    • Uživatelsky definované
      • Postup deklarace funkcí definovaných uživatelem
      • Příklady funkcí definovaných uživatelem

Co je to výjimka?

Jakýkoli abnormální stav nebo událost, která přerušuje normální tok instrukcí našeho programu za běhu nebo jednoduše řečeno výjimka, je chyba.

Syntaxe zpracování výjimek v PL/SQL

DECLARE
<declarations section>
BEGIN
<executable command(s)>
EXCEPTION
<exception handling goes here >
WHEN exception1 THEN
exception1-handling-statements
WHEN exception2&nbsp; THEN
exception2-handling-statements
WHEN exception3 THEN
exception3-handling-statements
........

WHEN others THEN
exception3-handling-statements
END;

Zde můžeme uvést tolik výjimek, kolik chceme zpracovat. Výchozí výjimka bude zpracována pomocí „WHEN other THEN“

Příklad zpracování výjimek v PL/SQL

Níže uvedený program zobrazuje jméno a adresu studenta, jehož ID je uvedeno. Protože v naší databázi není žádný student s hodnotou ID 8, program vyvolá výjimku za běhu NO_DATA_FOUND, která je zachycena v bloku EXCEPTION.

DECLARE 
   s_id studentS.id%type := 8; 
   s_name studentS.Name%type; 
   s_loc studentS.loc%type; 
BEGIN 
   SELECT  name, loation INTO  s_name, s_loc 
   FROM students 
   WHERE id = s_id;  
   DBMS_OUTPUT.PUT_LINE ('Name: '||  s_name); 
   DBMS_OUTPUT.PUT_LINE ('Location: ' || s_loc);
EXCEPTION 
   WHEN no_data_found THEN 
      dbms_output.put_line('No such student!'); 
   WHEN others THEN 
      dbms_output.put_line('Oops, Error!'); 
END; 

Výstup

No such student!
PL/SQL procedure successfully completed.  

Zde můžeme uvést tolik výjimek, kolik chceme zpracovat. Výchozí výjimka bude zpracována pomocí „KDYŽ ostatní PAK '

Typy výjimek v PL/SQL

  • Definováno systémem
  • Odpor uživatele

Dále v tomto článku o zpracování výjimek v PL/SQL probereme oba tyto typy podrobně.

Definováno systémem

Tyto výjimky jsou definovány a implicitně spravovány serverem Oracle a jsou definovány především v balíčku Oracle Standard Package. Kdykoli v programu dojde k výjimce, server Oracle se shoduje a identifikuje příslušnou výjimku z dostupné sady výjimek dostupných ve standardním balíčku Oracle. V zásadě jsou tyto výjimky předdefinované v PL/SQL, které se objeví KDYŽ dojde k porušení určitého databázového pravidla .

Výjimky definované systémem se dále dělí do dvou kategorií:

  • Pojmenované systémové výjimky
  • Nepojmenované systémové výjimky

Výjimky pojmenovaného systému

Jmenované výjimky PL/SQL jsou jmenovány ve standardním balíčku PL/SQL , proto vývojář nemusí ve svém kódu definovat výjimky PL/SQL. PL/SQL poskytuje mnoho předdefinovaných pojmenovaných výjimek, které se provádějí, když program poruší jakékoli databázové pravidlo. Následující tabulka uvádí několik důležitých předdefinovaných výjimek −

Výjimka Chyba Oracle SQLCODE Popis
ACCESS_INTO_NULL 06530 -6530 Je aktivována, když je nulovému objektu automaticky přiřazena hodnota.
CASE_NOT_FOUND 06592 -6592 Je aktivována, když není vybrána žádná z možností v klauzuli WHEN příkazu CASE a neexistuje žádná klauzule ELSE.
COLLECTION_IS_NULL 06531 -6531 Je vyvoláno, když se program pokusí použít metody sběru jiné než EXISTS na neinicializovanou vnořenou tabulku nebo varray, nebo se program pokusí přiřadit hodnoty prvkům neinicializované vnořené tabulky nebo varray.
DUP_VAL_ON_INDEX 00001 -1 Vyvolá se, když se pokusíte uložit duplicitní hodnoty do sloupce s jedinečným indexem.
INVALID_CURSOR 01001 -1001 Je aktivována, když jsou provedeny pokusy o provedení operace kurzoru, která není povolena, jako je zavření neotevřeného kurzoru.
INVALID_NUMBER 01722 -1722 Vyvolá se, když se převod řetězce znaků na číslo nezdaří, protože řetězec nepředstavuje platné číslo.
LOGIN_DENIED 01017 -1017 Vyvolá se, když se program pokusí přihlásit do databáze s neplatným uživatelským jménem nebo heslem.
NO_DATA_FOUND 01403 +100 Je aktivována, když příkaz SELECT INTO nevrátí žádné řádky.
NOT_LOGGED_ON 01012 -1012 Vyvolá se, když je vydáno volání databáze bez připojení k databázi.
PROGRAM_ERROR 06501 -6501 Vyvolá se, když má PL/SQL vnitřní problém.
ROWTYPE_MISMATCH 06504 -6504 Je aktivována, když kurzor načte hodnotu v proměnné s nekompatibilním datovým typem.
SELF_IS_NULL 30625 -30625 Je vyvolána, když je vyvolána členská metoda, ale instance typu objektu nebyla inicializována.
CHYBA STORAGE_ERROR 06500 -6500 Vyvolá se, když PL/SQL došla paměť nebo byla poškozena paměť.
TOO_MANY_ROWS 01422 -1422 Je aktivována, když příkaz SELECT INTO vrátí více než jeden řádek.
VALUE_ERROR 06502 -6502 Je aktivována, když dojde k chybě aritmetiky, převodu, zkrácení nebo omezení velikosti.
ZERO_DIVIDE 01476 1476 Je zvýšena, když je učiněn pokus o dělení čísla nulou.

Příklad

CREATE OR REPLACE PROCEDURE add_new_student
      (student _id_in IN NUMBER, student _name_in IN VARCHAR2)
IS
BEGIN
       INSERT INTO student (student _id, student _name )
       VALUES ( student _id_in, student _name_in );
EXCEPTION
       WHEN DUP_VAL_ON_INDEX THEN
 raise_application_error (-20001,'Duplicate student _id');
       WHEN OTHERS THEN
raise_application_error (-20002,'An error occurred.');
END;

V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat v tom, co jsou nepojmenované systémové výjimky.

Nepojmenované systémové výjimky

Systémové výjimky, pro které Oracle nemá jméno, jsou známé jako nepojmenované systémové výjimky. Tyto výjimky se nevyskytují často a jsou zapsány s kódem a přidruženou zprávou.

Existují v zásadě dva způsoby, jak zpracovat nepojmenované systémové výjimky:

1. Použití obslužné rutiny výjimky WHEN OTHERS

2. Přiřazení kódu výjimky k názvu a jeho použití jako pojmenované výjimky.

Některé kroky pro nepojmenované systémové výjimky:

  • Zvyšte je implicitně.
  • V případě, že nejsou zpracovány v části „WHEN Others“, je třeba je zpracovat explicitně.
  • Chcete-li výjimku zpracovat explicitně, mohou být deklarovány pomocí Pragma EXCEPTION_INIT a zpracovány odkazem na uživatelem definovaný název výjimky v sekci výjimek.

Příklad zpracování nepojmenovaných výjimek pomocí Pragma EXCEPTION_INIT je uveden dále v článku. V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat, abychom pochopili uživatelem definované výjimky.

Definováno uživatelem

Stejně jako všechny ostatní programovací jazyky vám také Oracle umožňuje deklarovat implementaci reklam vlastními výjimkami. Na rozdíl od výjimek definovaných systémem jsou tyto výjimky vyvolány explicitně v bloku PL/SQL.

Postup deklarování výjimek definovaných uživatelem v databázi Oracle

Uživatelsky definované výjimky v databázi Oracle můžeme definovat následujícími 3 způsoby:

  • Použití proměnné typu EXCEPTION

Zde můžeme deklarovat uživatelem definovanou výjimku deklarováním proměnné datového typu EXCEPTION v našem kódu a explicitně ji zvýšit v našem programu pomocí příkazu RAISE.

  • Použití funkce PRAGMA EXCEPTION_INIT

Nepředdefinované číslo chyby můžeme definovat pomocí proměnné datového typu EXCEPTION

  • Použití metody RAISE_APPLICATION_ERROR

Pomocí této metody můžeme deklarovat uživatelem definovanou výjimku s naším vlastním přizpůsobeným číslem chyby a zprávou.

Dosud jste možná měli přibližnou představu o způsobech, jakými můžeme vyvolávat uživatelem definované výjimky v PL/SQL. O každé z výše uvedených metod se dozvíme s příklady dále v tomto článku o zpracování výjimek v PL/SQL.

Dále v tomto článku budeme pokračovat s ukázkami zpracování výjimek definovaných uživatelem.

Ukázka výjimek definovaných uživatelem

V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat v tom, jak používat proměnnou typu EXCEPTION.

Použití proměnné typu EXCEPTION

Proces deklarování uživatelem definované výjimky je rozdělen do tří částí a tyto 3 části jsou:

  • Deklarujte datový typ výjimky proměnné
  • Upozornit na výjimku
  • Ošetření výjimky

Pojďme napsat kód, který podrobně demonstruje výše uvedené kroky.

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION

Ve výše uvedeném deklaračním bloku máme čtyři proměnné, z nichž první tři jsou proměnné datového typu s normálním počtem a čtvrtá, která je ex_DivZero, je speciální proměnná datového typu výjimky. Čtvrtá je naše uživatelsky definovaná výjimka.

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION

Výše uvedená prováděcí část tohoto anonymního bloku se aktivuje pouze tehdy, když je dělitel 0. Pokud je dělitel nula, jako je tomu v našem případě, dojde k chybě a ovládání programu přeskočí všechny další kroky a bude hledat odpovídající obsluhu výjimek. V případě, že najde nějakou jinou, provede příslušnou akci, jinak buď ukončí program, nebo nás vyzve s neošetřenou systémovou chybou.

EXCEPTION WHEN ex_DivZero THEN
DBMS_OUTPUT.PUT_LINE(‘ ERROR, The divisor can’t be zero’);

Toto je obsluha výjimky. Jakmile uživatel zadá dělitele jako 0, zobrazí se dotaz na výše uvedený řetězec zprávy.

Konečný kód:

DECLARE
       var_dividend NUMBER :=10;
       var_divisor  NUMBER :=0
       var_result NUMBER;
       ex-DivZero EXCEPTION
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
BEGIN
IF var_divisor =0 THEN
RAISE ex-DivZero;
END IF;
Var_result := var_dividend/var_divisor;
DBMS_OUTPUT.PUT_LINE (‘Result = ‘ || var_result);
END;

V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat, abychom pochopili, jak používat metodu PRAGMA_EXCEPTION_INIT.

Použití funkce PRAGMA EXCEPTION_INIT

Ve funkci PRAGMA EXCEPTION_INIT je název výjimky spojen s číslem chyby Oracle. Tento název lze použít při navrhování obslužné rutiny výjimky pro chybu. Pro velké projekty s mnoha uživateli definovanými chybami je PRAGMA EXCEPTION_INIT nejužitečnější a nejvhodnější metodou.

Syntaxe:

PRAGMA EXCEPTION_INIT(exception_name, -Oracle_error_number);

Příklad

DECLARE
   deadlock_detected EXCEPTION;
   PRAGMA EXCEPTION_INIT(deadlock_detected, -60);
BEGIN
 NULL; -- Some operation that causes an ORA-00060 error
EXCEPTION
   WHEN deadlock_detected THEN
      NULL; -- handle the error
END;

PRAGMA EXCEPTION_INIT říká kompilátoru, aby přiřadil název výjimky k číslu chyby Oracle, jak bylo zmíněno dříve. Umožňuje vám odkazovat na jakoukoli interní výjimku jménem a napsat pro ni konkrétní handler. Když uvidíte zásobník chyb nebo posloupnost chybových zpráv, je možné zachytit a zpracovat to, které je nahoře.

V tomto článku o zpracování výjimek v PL/SQL budeme pokračovat, abychom pochopili, jak používat metodu RAISE_APPLICATION_ERROR.

Použití metody RAISE_APPLICATION_ERROR

Je to procedura, která je součástí softwaru oracle. Pomocí tohoto postupu můžeme přiřadit číslo chyby k vlastní chybové zprávě. Kombinací čísla chyby a vlastní chybové zprávy lze sestavit chybový řetězec, který vypadá podobně jako výchozí chybové řetězce, které oracle zobrazí, když dojde k chybě. Procedura RAISE_APPLICATION_ERROR se nachází v balíčku DBMS_STANDARD

Syntaxe

raise_application_error (error_number, message [, {TRUE | FALSE}]);

Příklad

/* A trigger trg_emp_detail_chk is created.*/
CREATE OR REPLACE TRIGGER trg_emp_detail_chk

/* The trigger timing is declared as BEFORE UPDATE on the EMPLOYEES table.*/
Before UPDATE ON employees

DECLARE
permission_denied EXCEPTION;
BEGIN

/*Start of the IF condition checking whether the day of the system time is either Saturday or Sunday or not.*/
IF trim(TO_CHAR(sysdate,'Day')) IN ('Saturday', 'Sunday') THEN
raise_application_error(-20000, 'You are not authorized to do any modification in the weekends!!');

/* The procedure raise_application_error is called with the first parameter value as -20000 and the second parameter
with a default text stating that the user is not authorized to do any modification in the weekends. */
END IF;
END;

Tím se dostáváme ke konci tohoto článku o „Zpracování výjimek v PL/SQL“. Doufám, že je toto téma dobře pochopeno a pomohlo vám. Zkuste si napsat své vlastní kódy a začlenit do nich metody popsané v tomto článku.

Pokud se chcete nechat vyškolit od profesionálů na tuto technologii, můžete se rozhodnout pro strukturované školení od edureky! Podívejte se na toto MySQL DBA Certification Training od Edureka, důvěryhodné online vzdělávací společnosti se sítí více než 250 000 spokojených studentů po celém světě. Tento kurz vás naučí základní koncepty a pokročilé nástroje a techniky pro správu dat a správu databáze MySQL. Zahrnuje praktické učení pojmů jako MySQL Workbench, MySQL Server, Data Modeling, MySQL Connector, Návrh databáze, Příkazový řádek MySQL, Funkce MySQL atd. Na konci školení budete schopni vytvořit a spravovat vlastní databázi MySQL a spravovat data.

Máte na nás otázku? Uveďte to prosím v sekci komentářů tohoto článku „Zpracování výjimek v PL/SQL“ a my se vám co nejdříve ozveme.


  1. Přístup pomocí Microsoft SQL Server – import velkých datových sad pomocí SSIS

  2. Seznam SELECT není v klauzuli GROUP BY a obsahuje neagregovaný sloupec .... nekompatibilní s sql_mode=only_full_group_by

  3. Správné použití transakcí na serveru SQL Server

  4. V$SQL_SHARED_CURSOR TOP_LEVEL_RPI_CURSOR