Как в хранимой процедуре изменить текст в дефолтной ошибке на читабельный?

Начнем сначала. Допустим, мне нужно написать хранимую процедуру (Postgresql, версия 11), которая добавляла бы данные в таблицу и проверяла корректные ли данные введены пользователем.

Т.е. что-то типо этого:
CREATE PROCEDURE add_product_4 (a INT, b TIMESTAMP, c VARCHAR(20), d VARCHAR(50), e INT, f INT)
AS $$
BEGIN
INSERT INTO sales (ID, Sale_time, Pharmacy, product, Number_of_packages, Price)
VALUES (a, b, c, d, e, f);
END;
$$ LANGUAGE 'plpgsql';

Потом данная процедура вызывается, например так:
add_product_4('2', '2019.11.12 12:23:24', 'Апрель', 'Цитрамон', '18', '105');

Пока все хорошо. НО, если в последнюю переменную вставить строковое значение, то клиент выдаст ошибку:
"ERROR: ОШИБКА: неверное значение для целого числа: "df"
LINE 2: ...', '2019.11.12 12:23:24', 'Апрель', 'Цитрамон', '18', 'df');
^
SQL-состояние: 22P02
Символ: 78"

Моя же задача, чтобы данная ошибка приобрела читабельный вид.

Я попробовала сделать это так:
CREATE PROCEDURE add_product_4 (a INT, b TIMESTAMP, c VARCHAR(20), d VARCHAR(50), e INT, f INT)
AS $$
BEGIN
INSERT INTO sales (ID, Sale_time, Pharmacy, product, Number_of_packages, Price)
VALUES (a, b, c, d, e, f);
EXCEPTION
WHEN invalid_text_representation THEN
RAISE NOTICE 'Ошибка: неверный тип переменной';
END;
$$ LANGUAGE 'plpgsql';

Т.е. зная код ошибки (22P02), я зашла на сайт: https://www.postgresql.org/docs/11/errcodes-append...
и узнала, как эта ошибка называется, после чего вставила это название после конструкции EXCEPTION WHEN. И применила конструкцию RAISE NOTICE для того. чтобы клиент теперь выводил заданный мною текст.

Но в итоге, после выполнения колла, ничего не меняется, клиент так и выводит дефолтный ответ (см. картинку).
5f6ca9b35bd04903012432.png

Я смотрела видеоурок, где человек делает всё тоже самое и у него получается. я не могу понять, что я делаю не так?
Само задание получила от работодателя, т.е. это тестовое задание, поэтому так важно сделать именно так, как просят.
  • Вопрос задан
  • 186 просмотров
Пригласить эксперта
Ответы на вопрос 3
@Vitsliputsli
exception у вас привязан к insert, а ошибка возникает при вызове процедуры. Т.е вы вызываете процедуру
add_product_4 (INT, TIMESTAMP, VARCHAR, VARCHAR, INT, VARCHAR)
а увас есть только процедура:
add_product_4 (INT, TIMESTAMP, VARCHAR, VARCHAR, INT, INT)
, т.е. до выполнения INSERT даже не доходит.

Соответствие типов нужно учитывать обязательно. Вы можете, конечно, перегрузкой создать процедуру с нужным типом (вроде бы в PostgreSQL перегрузка есть), и там просто бросать нотайс, но это извращение. Если у поданной на вход процедуре переменной некорректный тип, это не исключение, это ошибка в коде, пересмотрите свой подход.
Ответ написан
Melkij
@Melkij
PostgreSQL DBA
У вас нет функции add_product_4 (a INT, b TIMESTAMP, c VARCHAR(20), d VARCHAR(50), e INT, f text), но поскольку процедура вызывается как 'df') - то попробуем имеющуюся, а для этого требуется привести 6 аргумент к числу. Что невозможно.

Итог: не имеет значения что вы напишете в процедуре, она вовсе не вызывается.

Добавьте вариант процедуры который принимает text и проверьте в процедуре число ли в этом тексте.
Ответ написан
@MaLuTkA_UA
Пользователь сам не вставляет значения в функции бд. Делайте валидацию вне бд.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы