|
![]() | Přehled chyb podle možností zpracování | ![]() | Chyby a výjimky | Diagnostické nástroje | ![]() |
Transakce spojují provádění operací s databází do atomických celků. Výskyt většiny chyb zasahuje do transakcí, může například předčasně ukončit transakci nebo způsobit odvolání transakce (rollback).
Dojde-li na SQL serveru k chybě nebo výjimce vyvolávající rollback transakce, pak další činnost může jít některou z těchto cest:
Informace o transakcích a jejich ovlivnění chybami poskytují funkce Transaction_open a Rolled_back.
Pokud je vyvolána výjimka typu "rollback exception condition", odvolají se změny od začátku transakce, ale provedou se příkazy za koncem bloku, v němž je deklarován EXIT handler pro tuto výjimku. Pokud toto chování není žádoucí, lze EXIT handler přesunout do vnějšího bloku nebo provést v něm příkaz RESIGNAL.
Zpracování výjimek osvětluje příklad:
Níže uvedená procedura Handling demonstruje zpracování výjimky pomocí EXIT handleru. Parametr handlable určuje, zda je vyvolá "handlable exception condition" (true) nebo "rollback exception condition" (false). Parametr resignal_it určuje, zda handler provede příkaz RESIGNAL. Pokud parametr resignal_it má hodnotu true, pak procedura vrátí chybu, protože žádný další handler pro tyto chybu není deklarován.
Pro vyvolání "handlable exception condition" použijeme uživatelskou výjimku ABC. Pro vyvolání "rollback exception condition" použijeme tabulku s unikátním klíčem, do níž se procedura pokusí vložit hodnoty vyvolávající duplicitu klíčů. Tabulka je definovaná takto:
CREATE TABLE RESTAB (VAL INTEGER, CONSTRAINT INDEX1 UNIQUE (VAL) NULL )
Tabulka bude zároveň obsahovat výsledek práce procedury. Procedura je:
PROCEDURE Handling(IN handlable Boolean, IN resignal_it Boolean); BEGIN declare abc condition; delete from restab; insert into restab values(0); commit; BEGIN declare exit handler for sqlexception, abc BEGIN update restab set val=val+100; commit; IF resignal_it THEN resignal; END IF; END; // make an update and commit it: update restab set val=val+1; // sets [val] to 1 commit; // make an uncommitted update: update restab set val=val+10; // sets [val] to 11 // raise the exception: IF handlable THEN signal abc; // raises the user-defined handlable excetion ELSE insert into restab values(11); // raises the "key duplicity" rollback-type exception END IF; update restab set val=val+1000; // not done because the block had been exited END; update restab set val=val+10000; // done unless the exception is resignalled END
Provedení procedury Handling má tento výsledek:
Parametr handlable | Parametr resignal_it | Výsledek val | Návratový kód procedury |
false | false | 10101 | OK |
false | true | 101 | Duplicita klíčů 40004 |
true | false | 10111 | OK |
true | true | 111 | Uživatelská výjimka ABC není ošetřena 45000 |
![]() | Přehled chyb podle možností zpracování | ![]() | Chyby a výjimky | Diagnostické nástroje | ![]() |