sql >> Databáze >  >> RDS >> PostgreSQL

Zpracování výjimek PostgreSQL

Chcete-li zachytit chybovou zprávu a její kód:

do $$       
begin

    create table yyy(a int);
    create table yyy(a int); -- this will cause an error

exception when others then 

    raise notice 'The transaction is in an uncommittable state. '
                 'Transaction was rolled back';

    raise notice '% %', SQLERRM, SQLSTATE;

end; $$ 
language 'plpgsql';

Dosud jsem nenašel číslo linky

AKTUALIZACE 16. dubna 2019

Jak navrhl Diego Scaravaggi, pro Postgres 9.2 a vyšší použijte STÁHNOUT DIAGNOSTIKU :

do language plpgsql $$
declare
    v_state   TEXT;
    v_msg     TEXT;
    v_detail  TEXT;
    v_hint    TEXT;
    v_context TEXT;
begin

    create table yyy(a int);
    create table yyy(a int); -- this will cause an error

exception when others then 

    get stacked diagnostics
        v_state   = returned_sqlstate,
        v_msg     = message_text,
        v_detail  = pg_exception_detail,
        v_hint    = pg_exception_hint,
        v_context = pg_exception_context;

    raise notice E'Got exception:
        state  : %
        message: %
        detail : %
        hint   : %
        context: %', v_state, v_msg, v_detail, v_hint, v_context;

    raise notice E'Got exception:
        SQLSTATE: % 
        SQLERRM: %', SQLSTATE, SQLERRM;     

    raise notice '%', message_text; -- invalid. message_text is contextual to GET STACKED DIAGNOSTICS only

end; $$;

Výsledek:

NOTICE:  Got exception:
        state  : 42P07
        message: relation "yyy" already exists
        detail : 
        hint   : 
        context: SQL statement "create table yyy(a int)"
PL/pgSQL function inline_code_block line 11 at SQL statement
NOTICE:  Got exception:
        SQLSTATE: 42P07 
        SQLERRM: relation "yyy" already exists

ERROR:  column "message_text" does not exist
LINE 1: SELECT message_text
               ^
QUERY:  SELECT message_text
CONTEXT:  PL/pgSQL function inline_code_block line 33 at RAISE
SQL state: 42703

Kromě GET STACKED DIAGNOSTICS je v souladu se standardem SQL, jeho diagnostické proměnné (např. message_text ) jsou kontextové pouze pro GSD. Pokud tedy máte pole s názvem message_text ve vaší tabulce není žádná šance, že by GSD mohlo zasahovat do hodnoty vašeho pole.

Stále však žádné číslo řádku.



  1. Odezva konkrétní řádky z databáze mysql

  2. Pivot s dynamickými sloupci v Oracle

  3. Jak změnit pořadové číslo databázového poštovního účtu v profilu v SQL Server (T-SQL)

  4. V MySQL nelze udělit oprávnění specifická pro sloupec