У меня есть приложение для весенней загрузки, в котором я использовал SimpleJdbcCall для выполнения хранимой процедуры, все отлично работает в Windows (jdk1.8.0_111), но когда я пытаюсь запустить его на сервере Linux (используя java 1.8.0_131), он выдает ошибку:
com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: Incorrect number of arguments for PROCEDURE banco.spcon_sesion; expected 18, got 0
Это мой код:
@Override
public Usuario sesion(Credenciales credenciales) {
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("spcon_sesion")
.declareParameters(new SqlParameter("in_usuario", Types.CHAR))
.declareParameters(new SqlParameter("in_contrasena", Types.CHAR))
.declareParameters(new SqlParameter("in_idSistema", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_idUsuario", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_nombre", Types.CHAR))
.declareParameters(new SqlOutParameter("out_paterno", Types.CHAR))
.declareParameters(new SqlOutParameter("out_materno", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idPerfil", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_nombrePerfil", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idComercio", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_nombreComercio", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idTerminal", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_nombreTerminal", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idSucursal", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_referenciaRetiroEfectivo", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idProveedorSucursal", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_codigo", Types.CHAR))
.declareParameters(new SqlOutParameter("out_mensaje", Types.CHAR));
SqlParameterSource in = new MapSqlParameterSource()
.addValue("in_usuario", credenciales.getUsuario())
.addValue("in_contrasena", credenciales.getContrasena())
.addValue("in_idSistema", credenciales.getIdSistema());
Map<String, Object> result = jdbcCall.execute(in);
@SuppressWarnings("unchecked")
List<Menu> menus = Menu
.obtenerListaMenus((List<Map<String, Object>>) result.get("#result-set-1"));
String codigo = (String) result.get("out_codigo");
if (codigo != null && codigo.equals("00")) {
try {
return new Usuario(
Util.ifNullToLong(result.get("out_idUsuario"), 0L),
Util.ifNullToString(result.get("out_nombre"), ""),
Util.ifNullToString(result.get("out_paterno"), ""),
Util.ifNullToString(result.get("out_materno"), ""),
Util.ifNullToString(result.get("out_referenciaRetiroEfectivo"), ""),
Util.ifNullToLong(result.get("out_idComercio"), 0L),
Util.ifNullToString(result.get("out_nombreComercio"), ""),
Util.ifNullToLong(result.get("out_idTerminal"), 0L),
Util.ifNullToString(result.get("out_nombreTerminal"), ""),
Util.ifNullToLong(result.get("out_idPerfil"), 0L),
Util.ifNullToString(result.get("out_nombrePerfil"), ""),
Util.ifNullToLong(result.get("out_idSucursal"), 0L),
Util.ifNullToLong(result.get("out_idProveedorSucursal"), 0L),
menus
);
} catch (Exception e) {
e.printStackTrace();
}
}
return null;
}
Также я пытаюсь использовать контейнер докеров с openjdk8, и появляется такая же ошибка, может ли кто-нибудь помочь мне с этой проблемой?




Похоже, вы столкнулись с проблемами чувствительности к регистру (в некоторых случаях Win и MacOS игнорируют регистры идентификаторов). Проверьте свои настройки, следуя документация.
Для начала попробуйте удалить все declareParameters - в них нет необходимости.
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("spcon_sesion");
SqlParameterSource in =
new MapSqlParameterSource()
.addValue("in_usuario", credenciales.getUsuario())
.addValue("in_contrasena", credenciales.getContrasena())
.addValue("in_idSistema", credenciales.getIdSistema());
Map<String, Object> result = jdbcCall.execute(in);
Если это не помогает - вместо инструментов SpringBoot в этом конкретном фрагменте кода используйте чистый отзывная инструкция для локализации проблемы. Также было бы хорошо создать хранимую процедуру с именами параметров в одном регистре (нижний или верхний) и протестировать ее вызов.
PS. Я предполагаю, что в jdbcTemplate может быть проблема (если возможно, дайте ее определение в вопросе), поэтому для упрощения ситуации рассмотрите возможность использования new SimpleJdbcCall(dataSource).
Я нашел ответ, мне нужно было добавить
.withoutProcedureColumnMetaDataAccess()
в simpleJdbcCall вот так:
SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName("spcon_sesion")
.withoutProcedureColumnMetaDataAccess()
.declareParameters(new SqlParameter("in_usuario", Types.CHAR))
.declareParameters(new SqlParameter("in_contrasena", Types.CHAR))
.declareParameters(new SqlParameter("in_idSistema", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_idUsuario", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_nombre", Types.CHAR))
.declareParameters(new SqlOutParameter("out_paterno", Types.CHAR))
.declareParameters(new SqlOutParameter("out_materno", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idPerfil", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_nombrePerfil", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idComercio", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_nombreComercio", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idTerminal", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_nombreTerminal", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idSucursal", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_referenciaRetiroEfectivo", Types.CHAR))
.declareParameters(new SqlOutParameter("out_idProveedorSucursal", Types.INTEGER))
.declareParameters(new SqlOutParameter("out_codigo", Types.CHAR))
.declareParameters(new SqlOutParameter("out_mensaje", Types.CHAR));
Надеюсь, это кому-то поможет :)
Пожалуйста, включите DDL для вашей хранимой процедуры