У меня есть следующая хранимая процедура, написанная в PostgreSQL 9.3, которая отлично работает:
CREATE OR REPLACE FUNCTION getColor(i INT)
RETURNS VARCHAR AS $varColor$
DECLARE varColor varchar;
BEGIN
select color into varColor FROM colors where id = i;
return varColor;
END;
$varColor$ LANGUAGE plpgsql;
Фактически, когда я выполняю select getColor(2)
в pgAdmin, я получаю ожидаемое значение. Я пытаюсь назвать это так на Java (упрощенная версия):
String call = "{ call getColor(?,?) }";
CallableStatement cstmt = connection.prepareCall(call);
cstmt.setInt(1, 2);
cstmt.registerOutParameter(2, java.sql.Types.VARCHAR);
boolean hadResults = cstmt.execute();
Проблема в том, что hadResults
всегда равно нулю. Есть идеи?
Концепция хранимых процедур Postgresql отличается от других поставщиков, таких как Oracle. В основном то, что в Oracle называется процедурой хранилища в Postgresql, может быть функцией, а для вызова функции в Java лучше использовать инструкции подготовки и методы executeQuery, как в следующем примере
String call = "select getColor(?)";
PreparedStatement pstmt = connection.prepareStatement(call);
pstmt.setInt(1,1);
Resultset resultset = pstmt.executeQuery();
Спасибо всем, кто помог в комментариях!
"String call = "select getColor(?)";
И вместо этого connection.prepareStatement()
CallableStatement
предназначен для «реальных» хранимых процедур. Функцию postgres лучше вызывать запускомselect getColor(2)
с использованиемPreparedStatement
иexecuteQuery()