PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Обработка на изключения в PostgreSQL

За да уловите съобщението за грешка и неговия код:

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

Все още не съм намерил номера на реда

АКТУАЛИЗАЦИЯ на 16 април 2019 г.

Както беше предложено от Diego Scaravaggi, за Postgres 9.2 и по-нови, използвайте ВЗЕМЕТЕ ДИАГНОСТИКА С НАБОР :

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

Резултат:

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

Освен GET STACKED DIAGNOSTICS е съвместим със стандарта SQL, неговите диагностични променливи (напр. message_text ) са контекстуални само за GSD. Така че, ако имате поле с име message_text във вашата таблица, няма шанс GSD да повлияе на стойността на вашето поле.

Въпреки това все още няма номер на ред.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. точки на прекъсване в eclipse с помощта на postgresql

  2. Cloud SQL Postgres Не е намерен подходящ драйвер за jdbc:postgres://google/

  3. Географски разпръснати сървъри, PostgreSQL и JPA

  4. Значение на различните подкани на командния ред в PostgreSQL?

  5. Грешка при създаването на SEQUENCE при възстановяване на базата данни PostgreSQL