Příkaz SQL TRY CATCH je navržen pro kontrolu code flow v případě, že nastane chybová situace (Error handling). Tato konstrukce obsahuje 2 bloky s tím, že je zde možné použít také transakci (viz článek o Transakcích). Pokud nastane chyba v prvním bloku – TRY..END , tak je aktivován mechanismus v CATCH..END bloku.
Syntaxe SQL Server TRY CATCH
BEGIN TRY
BEGIN TRANSACTION
--SQL kód zde
COMMIT
END TRY
BEGIN CATCH
ROLLBACK
END CATCH
- TRY část: V prvním bloku se typicky vyskytuje skript obsahující SQL DML nebo DDL (Create table, INSERT, UPDATE, atd) a případně i zahájení transakce BEGIN TRANSACTION a COMMIT příkaz na konci (v případě že chyba nenastane).
- CATCH část: Zde se nachází zavolání funkce nebo funkcí popisující Error (chybové hlášení, severity, atd.) s případným zalogováním chyby a dále ROLLBACK příkaz.
Příklad TRY CATCH s Error handling logováním do SQL tabulky
Pro příklad vyvoláme Error message tak, že se pokusíme dělit nulou. V CATCH části provedeme v případě chyby (která nastane) ROLLBACK a následně uložíme vlastnosti chyby do tempové tabulky pro pozdější analýzu:
BEGIN TRY
BEGIN TRANSACTION
SELECT 1/0 AS Vysledek
INTO #Temp;
COMMIT;
END TRY
BEGIN CATCH
ROLLBACK;
SELECT
ERROR_NUMBER() AS ErrorNumber,
ERROR_SEVERITY() AS ErrorSeverity,
ERROR_STATE() AS ErrorState,
ERROR_PROCEDURE() AS ErrorProcedure,
ERROR_LINE() AS ErrorLine,
ERROR_MESSAGE() AS ErrorMessage
INTO #Error_Log;
END CATCH
Skript jako takový proběhl úspěšně s tím, že chyba byla odchytnuta a parametry Erroru se nachází v tempové tabulce #Error_Log
SELECT * FROM #Error_Log;
Ještě zkontrolujeme jestli není otevřená transakce a byl správně proveden ROLLBACK v CATCH bloku..vše je OK
SELECT @@TRANCOUNT;
Váš příklad mi bohužel nefunguje. Testováno na Oracle 12_g.
Dostávám následující chybu:
Error report –
ORA-06550: line 2, column 1:
PLS-00103: Encountered the symbol “BEGIN” when expecting one of the following:
:= . ( @ % ;
06550. 00000 – “line %s, column %s:\n%s”
*Cause: Usually a PL/SQL compilation error.
*Action:
Dobrý den Ondřeji, syntaxe je platná pouze pro platformu databázového engine nad MS SQL Server, tedy T-SQL. V PL/SQL se transakce catchují tuším přes exception handlery viz. https://docs.oracle.com/cd/B10501_01/appdev.920/a96624/07_errs.htm
Dobrý den,
máte pravdu. Omlouvám se za zmatky a děkuji za upřesnění.
Díky za článek, ať se vám daří.
O.M.