Это потому, что ваша функция PL / pgSQL определена как:
replacePageRelevance(id INT, value REAL)
REAL - это плавающая точка одинарной точности, но на стороне Java вы пытаетесь использовать ее как двойную точность, и для такой ситуации неявное приведение не выполняется.
Вы должны скорее использовать CallableStatement.setFloat
для одинарной точности REAL
тип данных, однако это не совсем понятно, потому что чтение Java API:
Устанавливает назначенный параметр для данного значения Java с плавающей точкой.
драйвер преобразует это в значение SQL FLOAT, когда он отправляет его в
базы данных.
Поскольку FLOAT
является синонимом для DOUBLE PRECISION
в Postgres, он работает с тем же эффектом, что и CallableStatement.setDouble
, выдавая сообщение об ошибке (это странно).
Конечно, вы можете просто изменить свою функцию на replacePageRelevance(id INT, value DOUBLE PRECISION)
, и, как я проверял, она хорошо работает с вашим кодом.
Тем не менее, если вы хотите сохранить REAL
в своей функции), используйте явное приведение, например:
String PAGE_RELEVANCE_SQL = "{call replacePageRelevance(?, ?::real)}";