#postgresql #plpgsql
#postgresql #plpgsql
Вопрос:
У меня есть следующая функция:
create or replace function functions.send_occurrence(username_a varchar(80),
time_stamp timestamp, location varchar(100))
returns table(username varchar(80), occurrences bigint) as
$$
declare user_id int;
begin
select id into user_id from api.user where name = username_a;
insert into api.event values(user_id, time_stamp, location);
return query
select name, count(api.event.id)
from api.user left outer join api.event
on api.user.id = api.event.id
where name = username_a
group by name;
end;
$$ language plpgsql;
Функция создается успешно, но когда я нахожусь в клиенте psql и пытаюсь ее выполнить
select functions.send_occurrence('teste1', NOW(), 'testlocation');
Я получаю следующее сообщение об ошибке:
ERROR: function functions.send_occurrence(unknown, timestamp with time zone, unknown) does not exist
HINT: No function matches the given name and argument types. You might need to add explicit type casts.
Я знаю, что многие люди уже задавали этот вопрос, но все ответы, которые я видел, были связаны с числовыми типами и преобразованиями.
Комментарии:
1. Либо приведите
now()::timestamp
, либо измените типtime_stamp
параметра на `timestamptz.2. или использовать
localtimestamp()
вместоnow()
. Вы также можете упростить себе жизнь, если объявите параметры какtext
вместоvarchar(..)
как нетипизированные строковые литералы обрабатываются какtext
3. К вашему сведению,
varchar(80), varchar(100)
это будет работать не так, как вы думаете. Они будут сведены к обычнымvarchar
. Смотрите здесь , в разделе Примечания .4. @a_horse_without_name, которое было бы
localtimestamp
без круглых скобок.5. Это сработало, спасибо всем за ваши ответы. @AdrianKlaver вы правы, кто-то уже говорил мне об этом, но, тем не менее, спасибо за ваши замечания.