Да. спасибо) Комментом выше тоже самое сказали и вот что я поняла и овтетила:
"В кратце: дело в том, что переменных у меня было больше одной. И я использовала одну переменную, думая, что она сохранила своё первоначальное значение, хотя строчкой выше сама же это значение и поменяла.
Идиотка)
Поменяла строчки местами и всё заработало)
Только зря потратила ресурсы хабра))"
Антон Антон, вы не представляете, как вы мне помогли))
Почему-то сама я не додумалась свою теорию хотя бы проверить))
В кратце: дело в том, что переменных у меня было больше одной. И я использовала одну переменную, думая, что она сохранила своё первоначальное значение, хотя строчкой выше сама же это значение и поменяла.
Идиотка)
Поменяла строчки местами и всё заработало)
Только зря потратила ресурсы хабра))
Vitsliputsli, ну под "пользователем" я имела в виду "пользователя процедуры".
Согласна, не ясно выразилась.
Ну, грубо говоря, один человек разработал процедуру, а другой в БД её вызывает, вставляя значения.
И, допустим, это он дурачек и вставляет не тот тип, что делать?
Вообще задание выглядит вот так (см. картинку ниже).
В комментариях выдвинули теорию, что я не правильно поняла задание, может оно и вправду так и есть?
Т.е. вы предлагаете 6 переменной присвоить тип варчара, а после проверить подходит ли она под тип ИНТ, и если нет, то выдать ошибку?
Вашу мысль, про то, что процедура не вызывается я поняла.
Ещё раз обрисую картину.
На вход 6 переменной ДОЛЖНА подаваться переменная с типом "INT".
Но если пользователь дурачёк и ввел переменную с другим типом?
Меня просят, чтобы я создала процедуру, в которой, при возникновении данной ситуации вылезет читабельная ошибка.
"Если у поданной на вход процедуре переменной некорректный тип, это не исключение, это ошибка в коде, пересмотрите свой подход."
Так в том то и дело. На вход 6 переменной ДОЛЖНА подаваться переменная с типом int.
Но, допустим, пользователь дурачек и ввёл переменную с другим типом.
И меня просят, чтобы выскочила читабельная ошибка.
Как это можно реализовать?
Руслан ., Руслан, я извиняюсь, что часто вас дёргаю.
Можно у вас ещё попросить советов?
Начнем сначала. Допустим, мне нужно написать хранимую процедуру (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 для того. чтобы клиент теперь выводил заданный мною текст.
Но в итоге, после выполнения колла, ничего не меняется, клиент так и выводит дефолтный ответ (см. картинку).
Я смотрела видеоурок, где человек делает всё тоже самое и у него получается. я не могу понять, что я делаю не так?
Руслан ., Спасибо, в принципе работает, но все также остается вопрос: как поставить ограничение на тип данных? т.е. как мне сказать "если А не является типом INT, то выведи ошибку"?
Екатерина Шундеева,
CREATE PROCEDURE add_product (a INT, b TIMESTAMP, c VARCHAR(20), d VARCHAR(50), e INT, f INT)
LANGUAGE SQL
AS $$
INSERT INTO sales (ID, Sale_time, Pharmacy, product, Number_of_packages, Price)
VALUES (a, b, c, d, e, f);
IF a < 5 THEN
RAISE NOTICE 'перехватили ошибку 1';
$$;
ERROR: ОШИБКА: ошибка синтаксиса (примерное положение: "IF")
LINE 6: IF a < 5 THEN
^
Понимаете, мне не ясно, куда именно вставить это условие, и как должно выглядеть условие на проверку принадлежности к нужному типу данных. Те ресурсы, что вы мне прислали, я уже читала ранее, но они не работают. Постоянно ругается на ошибку синтаксиса.