====== Обработка исключений ======
[[https://habr.com/ru/articles/657667/]] - {{it:postgresql:exception:try_-_catch_v_postgresql.mht|mht}} - TRY / CATCH в PostgreSQL
__**Полный список переменных, которые можно получить командой GET STACKED DIAGNOSTICS**__
^Имя^Тип^Описание^
|RETURNED_SQLSTATE|text|код исключения|
|COLUMN_NAME|text|имя столбца, относящегося к исключению|
|CONSTRAINT_NAME|text|имя ограничения целостности, относящегося к исключению|
|PG_DATATYPE_NAME|text|имя типа данных, относящегося к исключению|
|MESSAGE_TEXT|text|текст основного сообщения исключения|
|TABLE_NAME|text|имя таблицы, относящейся к исключению|
|SCHEMA_NAME|text|имя схемы, относящейся к исключению|
|PG_EXCEPTION_DETAIL|text|текст детального сообщения исключения (если есть)|
|PG_EXCEPTION_HINT|text|текст подсказки к исключению (если есть)|
|PG_EXCEPTION_CONTEXT|text|строки текста, описывающие стек вызовов в момент исключения|
__**Пример**__
BEGIN
-- код, в котором может возникнуть исключение
EXCEPTION WHEN OTHERS
THEN
GET STACKED DIAGNOSTICS
err_code = RETURNED_SQLSTATE, -- код ошибки
msg_text = MESSAGE_TEXT, -- текст ошибки
exc_context = PG_CONTEXT, -- контекст исключения
msg_detail = PG_EXCEPTION_DETAIL, -- подробный текст ошибки
exc_hint = PG_EXCEPTION_HINT; -- текст подсказки к исключению
RAISE NOTICE 'ERROR CODE: % MESSAGE TEXT: % CONTEXT: % DETAIL: % HINT: %',
err_code, msg_text, exc_context, msg_detail, exc_hint;
END
Результаты обработки ошибки будут выведены на консоль (пример ошибки деления на 0):
ERROR CODE: 22012
MESSAGE TEXT: деление на ноль
CONTEXT: функция PL/pgSQL catch_exception(integer,integer), строка 14, оператор
GET STACKED DIAGNOSTICS
SQL-оператор: "SELECT e.res FROM catch_exception(4, 0) AS e"
функция PL/pgSQL inline_code_block, строка 5, оператор SQL-оператор
Result: 0