sql >> Database >  >> RDS >> PostgreSQL

Afhandeling van PostgreSQL-uitzonderingen

Om de foutmelding en de bijbehorende code op te vangen:

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

Ik heb het lijnnummer nog niet gevonden

UPDATE 16 april 2019

Zoals voorgesteld door Diego Scaravaggi, gebruik voor Postgres 9.2 en hoger GESTELDE DIAGNOSTIEK KRIJGEN :

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

Resultaat:

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

Afgezien van GET STACKED DIAGNOSTICS voldoet aan de SQL-standaard, zijn diagnostische variabelen (bijv. message_text ) zijn alleen contextueel voor GSD. Dus als je een veld hebt met de naam message_text in uw tabel, is er geen kans dat GSD de waarde van uw veld kan verstoren.

Maar nog steeds geen regelnummer.



  1. hoe kan ik mijn query minimaliseren?

  2. Doorloop klanten op basis van 12 maanden en controleer of een klant in de afgelopen 12 maanden niet heeft besteld

  3. Maak verbinding met MySQL op AWS vanaf een lokale computer

  4. Rownum-instructie retourneert een andere rij dan zonder deze