SQL TRY CATCH & Error handling

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

SQL TRY 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;

Pozn: Pokud bychom dali ROLLBACK za Error log, tak by samotné zalogování bylo v transakci a následným rollbackem bychom o něj přišli. SQL TRY CATCH by ale proběhlo korektně a transakce by byla odvolána (bohužel i s logováním). Z toho plyne na pořadí příkazů v CATCH pochopitelně záleží.

_______________________________________________________________________________________________
Intelligent technologies - podniková řešení a školení
Stránkonoš.cz - webové stránky za rozumnou cenu
SQL TRY CATCH & Error handling
Hodnocení

3 thoughts on “SQL TRY CATCH & Error handling

  1. Ondřej M.

    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:

    Reply
    1. Ondřej M.

      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.

      Reply

Napsat komentář

Vaše emailová adresa nebude zveřejněna.

This site uses Akismet to reduce spam. Learn how your comment data is processed.