PostgreSQL: ни одна функция не соответствует заданному имени и типам аргументов. Возможно, вам потребуется добавить явные приведения типов

#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 вы правы, кто-то уже говорил мне об этом, но, тем не менее, спасибо за ваши замечания.