Исключение «функция не существует» при выполнении хранимой функции PostgreSQL через JDBC

#postgresql #jdbc #stored-functions

#postgresql #jdbc #хранимые функции

Вопрос:

У меня возникают проблемы с вызовом функции PostgreSQL из JDBC при следующих обстоятельствах. Хранимая функция endpoint_organizations определяется следующим образом:

 postgres=# df public.endpoint_organizations   
                                             List of functions
 Schema |          Name          |             Result data type             | Argument data types |  Type  
-------- ------------------------ ------------------------------------------ --------------------- --------
 public | endpoint_organizations | TABLE(organizationid integer, name text) | staffid1 integer    | normal
(1 row)
  

Я вызываю ее из Java следующим образом:

 int staffId = 1
PreparedStatement endpointOrganizations = connection.prepareStatement("SELECT * FROM endpoint_organizations (?)");
endpointOrganizations.setInt(1, staffId);
ResultSet resultSet = endpointOrganizations.executeQuery();
  

И я получаю это исключение:

 org.postgresql.util.PSQLException: 
ERROR: function endpoint_organizations(integer) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 15
  

В чем может быть причина? Если я не ошибаюсь, это работало раньше. Я дважды проверил и трижды проверил сейчас, но не вижу, что может вызвать проблему.

Комментарии:

1. Есть ли у вас разрешение на выполнение этой функции с пользователем jdbc? Если не разрешить выполнение функции endpoint_organizations;

2. @d1ll1nger Да, у меня есть. Если я psql -U <user> попаду в базу данных и select * from endpoint_organizations(1) там, все будет работать нормально.

Ответ №1:

Это была (конечно) глупая ошибка с моей стороны. Я также внес последние обновления в сохраненную функцию после подключения к PostgreSQL с psql -U <user> помощью вместо psql -U <user> <database> , т.Е. Обновляет затронутую базу postgres данных вместо <database> , тогда как JDBC подключен к <database> .

После выполнения обновлений в нужной базе данных все возвращается в нормальное русло.