TRY / CATCH в PostgreSQL / Хабр
Во встроенном процедурном языке PL/pgSQL для СУБД PostgreSQL отсутствуют привычные операторы TRY / CATCH для для перехвата исключений возникающих в коде во время выполнения. Аналогом является оператор EXCEPTION, который используется в конструкции:
BEGIN
-- код, в котором может возникнуть исключение
EXCEPTION WHEN OTHERS -- аналог catch
THEN
-- код, обрабатывающий исключение
ENDЕсли необходимо обработать только конкретную ошибку, то в условии WHEN нужно указать идентификатор или код конкретной ошибки:
BEGIN
-- код, в котором может возникнуть исключение
EXCEPTION WHEN '<идентификатор_или_код_ошибки>'
THEN
-- код, обрабатывающий исключение
ENDВнутри секции EXCEPTION код ошибки можно получить из переменной SQLSTATE, а текст ошибки из переменной SQLERRM:
BEGIN
-- код, в котором может возникнуть исключение
EXCEPTION WHEN OTHERS
THEN
RAISE NOTICE 'ERROR CODE: %.
MESSAGE TEXT: %', SQLSTATE, SQLERRM;
ENDБолее подробную информацию по исключению можно получить командой GET STACKED DIAGNOSTICS:
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Полный список переменных, которые можно получить командой GET STACKED DIAGNOSTICS:
Имя | Тип | Описание |
|
| код исключения |
|
| имя столбца, относящегося к исключению |
|
| имя ограничения целостности, относящегося к исключению |
|
| имя типа данных, относящегося к исключению |
|
| текст основного сообщения исключения |
|
| имя таблицы, относящейся к исключению |
|
| имя схемы, относящейся к исключению |
|
| текст детального сообщения исключения (если есть) |
|
| текст подсказки к исключению (если есть) |
|
| строки текста, описывающие стек вызовов в момент исключения |
В качестве примера будет рассмотрена обработка ошибки деления на ноль в функции catch_exception:
CREATE OR REPLACE FUNCTION catch_exception
(
arg_1 int,
arg_2 int,
OUT res int
)
LANGUAGE plpgsql
AS $$
DECLARE
err_code text;
msg_text text;
exc_context text;
BEGIN
BEGIN
res := arg_1 / arg_2;
EXCEPTION
WHEN OTHERS
THEN
res := 0;
GET STACKED DIAGNOSTICS
err_code = RETURNED_SQLSTATE,
msg_text = MESSAGE_TEXT,
exc_context = PG_CONTEXT;
RAISE NOTICE 'ERROR CODE: % MESSAGE TEXT: % CONTEXT: %',
err_code, msg_text, exc_context;
END;
END;
$$;Вызов функции catch_exception со значением 0 в качестве второго параметра вызовет ошибку деления на ноль:
DO $$ DECLARE res int; BEGIN SELECT e.res INTO res FROM catch_exception(4, 0) AS e; RAISE NOTICE 'Result: %', res; END; $$;
Результаты обработки ошибки будут выведены на консоль:
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
404: Страница не найдена
Управление даннымиСтраница, которую вы пытались открыть по этому адресу, похоже, не существует. Обычно это результат плохой или устаревшей ссылки. Мы приносим свои извинения за доставленные неудобства.
Что я могу сделать сейчас?
Если вы впервые посещаете TechTarget, добро пожаловать! Извините за обстоятельства, при которых мы встречаемся. Вот куда вы можете пойти отсюда:
Поиск- Узнайте последние новости.
- Наша домашняя страница содержит самую свежую информацию об управлении данными/хранении данных.

- Наша страница «О нас» содержит дополнительную информацию о сайте, на котором вы находитесь, «Управление данными».
- Если вам нужно, свяжитесь с нами, мы будем рады услышать от вас.
Просмотр по категории
Бизнес-аналитика
- ThoughtSpot, партнер DBT, присоединится к BI и моделированию данных
Поставщик аналитики и инструмента с открытым исходным кодом уже разработал интеграцию, которая сочетает в себе BI самообслуживания и семантическое моделирование,…
- Инструмент Ascend.io предлагает бесплатный сбор данных для пользователей Snowflake
Free Ingest поощряет клиентов поставщика использовать его инструменты импорта данных, а не сторонние, чтобы упростить…
- Советы экспертов о том, как начать работу с аналитикой самообслуживания
В дополнение к простой в использовании платформе BI, ключом к развитию успешной культуры данных, управляемой бизнес-аналитиками, является .

..
ПоискAWS
- AWS Control Tower стремится упростить управление несколькими учетными записями
Многие организации изо всех сил пытаются управлять своей огромной коллекцией учетных записей AWS, но Control Tower может помочь. Сервис автоматизирует …
- Разбираем модель ценообразования Amazon EKS
В модели ценообразования Amazon EKS есть несколько важных переменных. Покопайтесь в цифрах, чтобы убедиться, что вы развернули службу…
- Сравните EKS и самоуправляемый Kubernetes на AWS
Пользователи
AWS сталкиваются с выбором при развертывании Kubernetes: запустить его самостоятельно на EC2 или позволить Amazon выполнить тяжелую работу с помощью EKS. См…
Управление контентом
- Лучшее программное обеспечение для управления корпоративным контентом 2023 года
Когда дело доходит до ECM, нужно учитывать множество поставщиков.
Изучите 10 платформ, чтобы понять их возможности и … - 3 преимущества систем управления информацией о продуктах 9Системы 0002 PIM помогают розничным торговцам управлять информацией о продуктах по каналам. Основные преимущества системы PIM включают в себя улучшенную работу сотрудников …
- 7 лучших практик для стратегий управления знаниями
Организации не могут развернуть стратегию управления знаниями за один день. Тем не менее, с помощью этих передовых методов эти предприятия могут …
ПоискOracle
- Oracle ставит перед собой высокие национальные цели в области ЭУЗ с приобретением Cerner
Приобретя Cerner, Oracle нацелилась на создание национальной анонимной базы данных пациентов — дорога, заполненная …
- Благодаря Cerner Oracle Cloud Infrastructure получает импульс
Oracle планирует приобрести Cerner в рамках сделки на сумму около 30 миллиардов долларов.
Второй по величине поставщик электронных медицинских карт в США может вдохнуть новую жизнь … - Верховный суд встал на сторону Google в иске о нарушении авторских прав на Oracle API
Верховный суд постановил 6-2, что API-интерфейсы Java, используемые в телефонах Android, не подпадают под действие американского закона об авторском праве, в связи с чем …
ПоискSAP
- Безопасность SAP требует определенных навыков, командной работы
Критические уязвимости SAP вызывают постоянную озабоченность, и их количество растет по мере того, как системы SAP становятся все более открытыми благодаря цифровому преобразованию и…
- Платформа SAP с низким кодом надеется заполнить пробелы разработчиков
SAP Build, новая платформа с низким кодом, дебютировавшая на SAP TechEd, предназначена для того, чтобы бизнес-пользователи могли создавать приложения, но она .
.. - SAP Sustainability Control Tower стремится упростить отчетность ESG
SAP Sustainability Control Tower позволяет компаниям любого размера собирать данные ESG и управлять ими. Обновленная модель SaaS ориентирована на…
PostgreSQL Else If Statement с примерами
PostgreSQL предлагает несколько операторов принятия решений, таких как IF , IF-THEN-ELSE , IF-THEN-ELSIF и т. д. Все эти управляемые решениями операторы используются для управления поток операторов SQL на основе определенных критериев. В Postgres операторы IF и IF-THEN-ELSE оценивают только одно условие; однако оператор IF-THEN-ELSIF оценивает несколько условий.
В этой статье рассматривается работа оператора IF-THEN-ELSIF на практических примерах. Итак, начнем.
Как работает оператор ELSE IF в PostgreSQL?
IF-THEN-ELSIF — это одно из утверждений, основанных на принятии решений, которые оценивают несколько условий.
- Оператор IF THEN ELSIF проверяет/оценивает каждое условие одно за другим.
- Когда условие становится истинным, все операторы, связанные с этим условием, будут выполнены, а остальные условия будут пропущены.
- Если ни одно из указанных условий не возвращает истинное значение, будут выполнены операторы, связанные с частью else.
Синтаксис
В приведенном ниже фрагменте поясняется синтаксис оператора IF-THEN-ELSIF:
IF condition_1 THEN Заявления; //выполняется, только если условие_1 получает значение true. ELSIF условие_2 ТО Заявления; //выполняется, только если условие_2 получает значение true. ... ELSIF условие_n ТО Заявления; //выполняется, только если условие_n получает значение true. ЕЩЕ Заявления; //выполняется только в том случае, если все предоставленные условия возвращают значение false.КОНЕЦ ЕСЛИ;
Пример №1: Как использовать оператор IF-THEN-ELSIF в Postgres?
Создадим две переменные и присвоим им несколько случайных значений:
DO $$ ЗАЯВИТЬ first_val INT := 72; second_val INT := 50; НАЧИНАТЬ ЕСЛИ первое_значение < второе_значение ТО RAISE NOTICE 'first_val меньше, чем second_val'; ELSIF первое_значение > второе_значение ТО RAISE NOTICE 'first_val больше, чем second_val'; ЕЩЕ RAISE NOTICE 'first_val равно second_val'; КОНЕЦ ЕСЛИ; КОНЕЦ $$;
В этом примере мы создали две переменные с именами first_val и second_val. Мы присвоили им целочисленные значения. После этого мы использовали условные операторы для сравнения их значений:
- В операторе if мы проверили, является ли first_val < second_val; если да, то показать сообщение «first_val меньше, чем second_val».
- Иначе, если first_val > second_val; затем верните «first_val больше, чем second_val».

- В противном случае появится сообщение «first_val равно second_val».
Выходные данные показывают, что условие, указанное в части ELSIF, возвращает истинное значение, поэтому выполняется оператор, связанный с частью ELSIF.
Пример №2: Как использовать оператор ELSIF для данных таблицы?
Мы создали таблицу с именем student_info и вставили в нее следующие записи:
SELECT * FROM student_info;
Теперь мы укажем следующие пять сценариев в управляющих операторах:
- Если std_age <= 18 и std_gender = M, то показать «Teenage Male».
- Если std_age <= 18 и std_gender = F, то показать «Teenage Female».
- Если std_age > 18 и std_gender = M, то показать «Взрослый мужчина».
- Если std_age > 18 и std_gender = F, показать «Взрослая женщина».

- Если ни одно из вышеприведенных условий не возвращает true, показать уведомление «Студент с указанным id не существует в таблице student_info».
ДО $$ ЗАЯВИТЬ student_data student_info% rowtype; НАЧИНАТЬ ВЫБЕРИТЕ * ОТ student_info INTO student_data ГДЕ std_id = 3; ЕСЛИ student_data.std_age <= 18 И student_data.std_gender= 'M' ТО ПОДНЯТЬ УВЕДОМЛЕНИЕ «Мужчина-подросток»; ELSIF student_data.std_age > 18 AND student_data.std_gender= 'M' ТОГДА ПОДНЯТЬ УВЕДОМЛЕНИЕ «Взрослый мужчина»; ELSIF student_data.std_age <=18 AND student_data.std_gender= 'F' ТОГДА ПОДНЯТЬ УВЕДОМЛЕНИЕ «Девочка-подросток»; ELSIF student_data.std_age >18 AND student_data.std_gender= 'F' ТОГДА ПОДНЯТЬ УВЕДОМЛЕНИЕ «Взрослая женщина»; ЕЩЕ RAISE NOTICE 'Студент с указанным идентификатором не существует в таблице student_info'; КОНЕЦ ЕСЛИ; КОНЕЦ $$
Поскольку студент с идентификатором 3 является 19-летним мужчиной, оператор ELSIF, удовлетворяющий заданному условию, получает примечание «Взрослый мужчина».

res INTO res
FROM catch_exception(4, 0) AS e;
RAISE NOTICE 'Result: %', res;
END;
$$;
КОНЕЦ ЕСЛИ;