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, удовлетворяющий заданному условию, получает примечание «Взрослый мужчина».