我有一个Spring Boot应用程序,在其中使用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的docker容器,并且出现相同的错误,有人可以帮助我解决这个问题吗?
答案 0 :(得分:0)
您似乎正面临区分大小写的问题(在某些情况下,Win和MacOS会忽略标识符的大小写)。按照documentation检查设置。
首先,尝试删除所有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工具,请使用纯callable statement来定位问题。创建具有相同名称(低位或高位)的参数名称的存储过程并测试其调用也将是很好的。
PS。我想jdbcTemplate
中可能存在问题(如果可能,请在问题中提供其定义),因此为了简化这种情况,请考虑使用new SimpleJdbcCall(dataSource)
。
答案 1 :(得分:0)
我找到了答案,我需要添加
.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));
希望这对某人有所帮助:)