Я пытаюсь выполнить хранимую функцию в DB2 из Java. Функция и код, который ее вызывает, очень похожи на код из примера документации Spring https://docs.spring.io/spring/docs/current/spring-framework-reference/html/jdbc.html#jdbc.-simple-jdbc-call-3. Вот объявление функции:
CREATE FUNCTION ST_CLIENT_SEGMENT( p_oib VARCHAR(11) )
RETURNS VARCHAR(10)
NO EXTERNAL ACTION
Вот код:
//version1
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("VLIB").
.withFunctionName("ST_CLIENT_SEGMENT")
SqlParameterSource in = new MapSqlParameterSource().addValue("p_oib", "123");
return simpleJdbcCall.executeFunction(String.class, in);
//version2
SimpleJdbcCall simpleJdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withSchemaName("VLIB")
.withFunctionName("ST_CLIENT_SEGMENT");
simpleJdbcCall.declareParameters(new SqlParameter("p_oib", Types.VARCHAR));
return simpleJdbcCall.executeFunction(String.class, "123");
//the same exception
//Caused by: java.sql.SQLException: [SQL0440] Routine ST_CLIENT_SEGMENT in VLIB not found with specified parameters.
кто-нибудь знает, почему это произошло? Когда я вызываю функцию из моего SQL-клиента, все работает нормально.
{? = call vlib.st_client_segment(?)}
, который затем должен быть преобразован драйвером JDBC. Вполне может быть, что драйвер JDBC DB2 поддерживает только выполнение хранимых процедур с Экранирование вызова JDBC, поэтому он может сгенерировать SQL, недопустимый для вызова функции. - person Mark Rotteveel   schedule 14.12.2016