Функция регистрации Postgres и выдача исключения - PullRequest
0 голосов
/ 23 октября 2018

Я хотел бы отловить возникшую ошибку, записать некоторую информацию в таблицу (INSERT ErrorLog ...), связанную с ошибкой, и поднять ошибку обратно до вызывающей стороны. Я не хочу, чтобы регистрируемая информация откатывалась, как я могу это сделать?сделать это? Мы работаем с Postgres версии 8.3

DECLARE
  text_var1 text;
  text_var2 text;
  text_var3 text;

INSERT INTO mytab(firstname, lastname) VALUES('Tom', 'Jones');
BEGIN
    UPDATE mytab SET firstname = 'Joe' WHERE lastname = 'Jones';
    x := x + 1;
    y := x / 0;
EXCEPTION WHEN OTHERS THEN
 GET STACKED DIAGNOSTICS text_var1 = MESSAGE_TEXT,
                          text_var2 = PG_EXCEPTION_DETAIL,
                          text_var3 = PG_EXCEPTION_HINT;
    INSERT ErrorLog(message, detail) values(text_var1, text_var2);
    RAISE EXCEPTION 'Error Occured %\n%', text_var1, text_var2;
    RETURN x;
END;

1 Ответ

0 голосов
/ 23 октября 2018

Невозможно отобразить его, поскольку возбуждаемое вами исключение (после перехвата другого) откатывает транзакцию и, следовательно, также INSERT в блоке EXCEPTION.Таким образом, функция также ничего не вернет.

Обходные пути включают в себя:

  • Повышение WARNING вместо EXCEPTION.
  • В Postgres 11 или более поздней версии вместо функции используется процедура, в которой вы можете вручную управлять транзакциями.
  • Используйте dblink или аналогичный инструмент для эмуляции «автономной транзакции».Пример:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...