Sql

Raise postgresql: PostgreSQL : Документация: 9.6: 41.8. Сообщения и ошибки : Компания Postgres Professional

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:

Имя

Тип

Описание

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

строки текста, описывающие стек вызовов в момент исключения

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *