Я знаю, что этот вопрос задавался много раз, однако я не могу понять, что не так, несмотря на то, что следую ответам SO. Буду признателен за помощь, так как я новичок в PostgreSQL. Вот шаги, которые я выполнил.
CREATE OR REPLACE PROCEDURE f_data(IN arg1 integer, IN arg2 integer)
LANGUAGE sql
AS $$
INSERT INTO tbl (col1, col2) VALUES (arg1, arg2);
$$;
CALL public.f_data(1, 2)
Выполнение этого вызвало следующее заявление об ошибке
ERROR: procedure public.f_data(integer, integer) does not exist
LINE 1: CALL public.f_data(1::integer, 2::integer)
^
HINT: No procedure matches the given name and argument types. You might need to add explicit type casts.
SQL state: 42883
Character: 6
я тоже пробовал
CALL public.f_data(1::integer, 2::integer)
Получил ту же ошибку, упомянутую выше.
Где я ошибаюсь? Отметит ответ как принятый только с четко подробными шагами.
@JimJones Спасибо за ваш комментарий. Однако дело было в другом. Я решил это и разместил ответ ниже.
Я смог решить проблему. Использование графического интерфейса для создания процедуры — ужасный способ ведения дел. Я понял, что GUI предлагает еще 2 вкладки - параметры и SQL. Быстрая проверка вкладки SQL выявила следующий код.
CREATE OR REPLACE PROCEDURE public.f_data()
LANGUAGE sql
AS $$
CREATE OR REPLACE PROCEDURE f_data(IN arg1 integer, IN arg2 integer)
LANGUAGE sql
INSERT INTO tbl (col1, col2) VALUES (arg1, arg2);
$$;
По сути, код, который я написал в разделе кода графического интерфейса, в конечном итоге был включен в тело хранимой процедуры. Вы также можете заметить, что первая строка кода не имеет параметров. Я попытался добавить параметры с помощью вкладки параметров, однако, похоже, что пользовательские параметры не разрешены.
В любом случае, я отказался от идеи использовать графический интерфейс для создания процедуры, открыл новый редактор запросов и написал тот же код, который я разместил в вопросе, и на этот раз он сработал.
РЕДАКТИРОВАТЬ
Если вы хотите установить входные параметры для хранимой процедуры с помощью графического интерфейса, вы должны сделать это на вкладке определения.
Ваш код выглядит просто отлично. Возможно, процедура создается в другой схеме? Чтобы убедиться, попробуйте:
CREATE OR REPLACE PROCEDURE public.f_data(IN arg1 integer, IN arg2 integer)
. Это решает вашу проблему? dbfiddle.uk/MTkiWpIg